主页 > 前端 > javascript >
来源:未知 时间:2021-02-04 15:29 作者:小飞侠 阅读:次
[导读] js在浏览器的两个页面之间通信详解 两个浏览器窗口间通信总结: 1、localStorage 一个窗口更新localStorage, 另一个窗口监听window对象的”storage”事件,来实现通信。 //本窗口的设值代码...
|
js在浏览器的两个页面之间通信详解 两个浏览器窗口间通信总结: 1、localStorage一个窗口更新localStorage, 另一个窗口监听window对象的”storage”事件,来实现通信。 // 本窗口的设值代码
localStorage.setItem('aaa', (Math.random()*10).toString())
// 其他窗口监听storage事件
window.addEventListener("storage", function (e) {
console.log(e)
console.log(e.newValue)
})注:两个页面要同源(URL的协议、域名和端口相同) 2、WebSocket每个页面开启同一个地址的WebSocket服务,利用send发送消息,利用onmessage获取消息的变化。 var ws = new WebSocket("ws://localhost:3000/")
ws.onopen = function (event) {
// 或者把此方法注册到其他事件中,即可与其他服务器通信
ws.send({now : Date.now()}); // 通过服务器中转消息
};
ws.onmessage = function (event) {
// 消费消息
console.log(event.data);
}优点: 不仅能在不同窗口之间,还能跨浏览器,兼容性最佳。 缺点: 需要消耗点服务器资源 3、postMessagepostMessage()方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档、多窗口、跨域消息传递。 消息发送:otherWindow.postMessage(message, targetOrigin); otherWindow 其他窗口的一个引用,比如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames。 .message 要传递的数据,由于部分浏览器只能处理字符串参数,所以我们在传递参数的时候需要使用JSON.stringify()方法对对象参数字符串化 targetOrigin 通过窗口的origin属性来指定哪些窗口能接收到消息事件, 参考链接 :https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage 消息接收监听:监听message事件 //发送消息页面
<iframe onLoad="loadIFreamSite()" id="loadIframeSite" src="地址" frameborder="0" scrolling="no" allowtransparency=true style="width: 100%;" ></iframe>
function loadIFreamSite(){
var iframe = document.querySelector('#loadIframeSite');
iframe.contentWindow.postMessage({a: 1}, '*');
}
//监听消息页面
window.addEventListener('message', function(e) {
// 监听消息内容
}, true);4、cookie + setInterval【差】在页面A设置一个使用 setInterval 定时器不断刷新,检查 Cookies 的值是否发生变化,如果变化就进行刷新的操作。 缺点:相当浪费资源 5、SharedWorkerHTML5 中的 Web Worker 可以分为两种不同线程类型, 一个是专用线程 Dedicated Worker, 一个是共享线程 Shared Worker。 Dedicated Worker直接使用new Worker()即可创建,这种webworker是当前页面专有的。 SharedWorker可以被多个window、标签页、iframe共同使用,但必须保证这些标签页都是同源的 具体实列: // a.html
<input id='number1' />
<input id='number2' />
<div class='result1'></div>
var first = document.querySelector('#number1');
var second = document.querySelector('#number2');
var result1 = document.querySelector('.result1');
if (!!window.SharedWorker) {
var myWorker = new SharedWorker("b.js");
first.onchange = function() {
myWorker.port.postMessage([first.value, second.value]);
console.log('Message posted to worker');
}
second.onchange = function() {
myWorker.port.postMessage([first.value, second.value]);
console.log('Message posted to worker');
}
myWorker.port.onmessage = function(e) {
result1.textContent = e.data;
console.log('Message received from worker');
console.log(e.lastEventId);
}
}
// b.js
onconnect = function(e) {
var port = e.ports[0];
port.onmessage = function(e) {
var workerResult = 'Result: ' + (e.data[0] * e.data[1]);
port.postMessage(workerResult);
}
}6、直接引用其实本质上就是直接获取对方DOM // 父页面获取子iframe
document.getElementById('iframe的id').contentWindow.document
// 子iframe获取父页面
window.parent.document缺点 只适用于两个页面在同一域,比如在A页面中嵌套一个同源的iframe |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com