主要是这两个方案,其他的,还有
SharedWorker
、IndexedDB
、WebSocket
、Service Worker
如果是,父子嵌套 iframe 还可以使用 window.parent.postMessage(“需要传递的参数”, ‘*’)
1、localStorage
核心点
同源,不能跨域(协议、端口、域名三者有一个不一样)
使用storage事件监听localStorage变化
示例代码
pageA 界面
<body>
<h1>1、localStorage</h1>
<h2>pageA</h2>
<script>
window.addEventListener("storage", (e) => {
console.info("localStorage发生变化:", e)
})
</script>
</body>
pageB 界面
<body>
<h1>1、localStorage</h1>
<h2>pageB</h2>
<button id="btnB">添加数据到 localStorage</button>
</body>
<script>
let btnB = document.getElementById("btnB");
let num = 0;
btnB.addEventListener("click", () => {
localStorage.setItem("num", num++)
})
</script>
当在 B界面上,点击添加的时候,A界面会输出结果
2、BroadcastChannel
核心点
同源
- 两个界面,务必保证
频道名称一样
示例代码
pageA界面
<body>
<h1>1、localStorage</h1>
<h2>pageA</h2>
<h1>2、BroadcastChannel</h1>
<span id="span2">发送广播</span>
<script>
window.addEventListener("storage", (e) => {
console.info("localStorage发生变化:", e)
})
document.querySelector('#span2').addEventListener('click', () => {
// 创建 某个频道
var bc = new BroadcastChannel("test_channel");
bc.postMessage({ msg: "A界面发送来的" })
})
</script>
</body>
pageB 界面
<body>
<h1>1、localStorage</h1>
<h2>pageB</h2>
<button id="btnB">添加数据到 localStorage</button>
</body>
<script>
let btnB = document.getElementById("btnB");
let num = 0;
btnB.addEventListener("click", () => {
localStorage.setItem("num", num++)
})
var bc = new BroadcastChannel("test_channel");
bc.onmessage = function (ev) {
console.log('收到了消息', ev);
};
</script>
window.parent.postMessage
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<iframe src="./son.html" frameborder="0"></iframe>
<script>
//监听单个事件
window.addEventListener('message', function (msg) {
console.log(msg, '发生了变化')
})
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h2>发送请求</h2>
<script>
// window.parent 是 iframe 子页面获取父页面的 window 对象
document.querySelector('h2').addEventListener('click',()=>{
window.parent.postMessage("需要传递的参数", '*')
})
// 后面的 * 号就是处理跨域问题的,任何域名都不会出现跨域问题
// 也可以指定传送域名地址,这个域名不会出现跨域问题,写父页面(接收)域名地址
// window.parent.postMessage("需要传递的参数", 'http://0.0.0.0:8080')
// 传递的参数可以是数组,对象,字符串等
</script>
</body>
</html>
3、参考连接
BroadcastChannel MDN 介绍