window.open 同源页面场景下,引用共享 vs 复制快照的实测结论
项目场景需要缓存 localStorage 或者 sessionStorage 的时候,涉及到跨页面传值通信。以 a 页面通过 window.open 打开的同源页面 b 页面为例,测试下 localStorage 或者 sessionStorage 的页面通信。
以下所有结论基于两点前提:
创建 a 页面代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<button onclick="setaa()">设置aa</button>
<button onclick="setbb()">设置bb</button>
<button onclick="opentest()">打开同源页面</button>
<script>
const setaa = () => {
localStorage.setItem('aaa', 'aaa')
}
const setbb = () => {
localStorage.setItem('bbb', 'bbb')
}
const opentest = () => {
window.open('./test2.html', "_blank")
}
</script>
</body>
</html>
同样的流程,创建原始页面代码如下(原文此处误写为 localStorage,按代码实际使用 sessionStorage 修正标注):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<button onclick="setaa()">设置aa</button>
<button onclick="setbb()">设置bb</button>
<button onclick="opentest()">打开同源页面</button>
<script>
const setaa = () => {
sessionStorage.setItem('aaa', 'aaa')
}
const setbb = () => {
sessionStorage.setItem('bbb', 'bbb')
}
const opentest = () => {
window.open('./test2.html', "_blank")
}
</script>
</body>
</html>
| 验证场景 | localStorage | sessionStorage |
|---|---|---|
| 新页面前已有缓存 | 可获取 | 可获取(复制一份) |
| 打开后原始页新增缓存 | 新页面可获取 | 新页面获取不到 |
| 新页面操作(如 clear) | 影响原始页面 | 不影响原始页面 |