完成浏览器内多个标签页之间的通讯
第一种体式格局:websocket协定.
1.起首我们得相识websocket是什么?
它是一种收集通讯协定
2.为何会用到websocket?
由于http有缺点,通讯只能够由客户端提议,服务器没法主意向客户端发送音讯。
但假如这时候,服务器有一连变化的状况,那末就只能运用轮询的体式格局来访问。
轮询:每隔一段时间,就发出一个讯问.
由于websocket具有全双工(full-duplex)通讯天然能够完成多个标签页之间的通讯.
第二种体式格局:localstorage
localstorage是浏览器多个标签共用的存储空间,所以能够用来完成多标签之间的通讯
这里补充一点其他的:session是会话级的存储空间,每一个标签页都是零丁的
运用体式格局:直接在window对象上增加监听,以下为例子:
标签页1:
<input id="name">
<input type="button" id="btn" value="提交">
<script type="text/javascript">
$(function(){
$("#btn").click(function(){
var name=$("#name").val();
localStorage.setItem("name", name);
});
});
</script>
标签页2:
<script type="text/javascript">
$(function(){
window.addEventListener("storage", function(event){
console.log(event.key + "=" + event.newValue);
});
});
</script>
storage事宜,针对都是非当前页面临localStorage举行修正时才会触发,当前页面修正localStorage不会触发监听函数。
第三种体式格局:html5浏览器的新特征SharedWorker
关于SharedWorker
一般的webworker直接运用new Worker()即可竖立,这类webworker是当前页面专有的。然后还有种同享worker(SharedWorker),这类是能够多个标签页、iframe配合运用的。
SharedWorker能够被多个window配合运用,但必需保证这些标签页都是同源的(雷同的协定,主机和端口号)
运用体式格局
起首新建一个js文件worker.js,详细代码以下:
// sharedWorker所要用到的js文件,没必要打包到项目中,直接放到服务器即可
let data = ''
onconnect = function (e) {
let port = e.ports[0]
port.onmessage = function (e) {
if (e.data === 'get') {
port.postMessage(data)
} else {
data = e.data
}
}
}
webworker端(临时如许称谓)的代码就如上,只需注册一个onmessage监听信息的事宜,客户端(即运用sharedWorker的标签页)发送message时就会触发.
注重点
1.webworker没法在当地运用,出于浏览器自身的平安机制,所以我此次的示例也是放在服务器上的,worker.js和index.html在统一目次。
2.由于客户端和webworker端的通讯不像websocket那样是全双工的,所以客户端发送数据和吸收数据要分红两步来处置惩罚。示例中会有两个按钮,离别对应的向sharedWorker发送数据的要求以及猎取数据的要求,但他们本质上都是雷同的事宜–发送音讯。
3.webworker端会举行推断,通报的数据为’get’时,就把变量data的值回传给客户端,其他状况,则把客户端通报过来的数据存储到data变量中。下面是客户端的代码:
// 这段代码是必需的,翻开页面后注册SharedWorker
//显现指定worker.port.start()要领竖立与worker间的衔接
if (typeof Worker === "undefined") {
alert('当前浏览器不支持webworker')
} else {
let worker = new SharedWorker('worker.js')
worker.port.addEventListener('message', (e) => {
console.log('来自worker的数据:', e.data)
}, false)
worker.port.start()
window.worker = worker
}
// 猎取和发送音讯都是挪用postMessage要领,我这里商定的是通报'get'示意猎取数据。
window.worker.port.postMessage('get')
window.worker.port.postMessage('发送信息给worker')
webSocket怎样兼容低浏览器?
1.Adobe Flash Socket
2.ActiveX HTMLFile (IE)
3.基于 multipart 编码发送 XHR
4.基于长轮询的 XHR