完成浏览器内多个标签页之间的通讯

完成浏览器内多个标签页之间的通讯

第一种体式格局: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

以上内容的参考链接 – 多个标签完成通讯
关于websocket道理的风趣诠释

    原文作者:少年版
    原文地址: https://segmentfault.com/a/1190000018354650
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞