如何实现浏览器多个标签页内通信

  1. localstorage
    // 赋值
    let student1 = {id: '2013010818', name: 'wangyakun', sex: 'woman', age: 20}
    loaclStorage.setItem('student', student1)
    
    // 取值
    loaclStorage.getItem('student')
    
    // 删除
    loaclStorage.removeItem('student')

    在一个标签页中添加数据,另一个标签页可以直接获取该值
    h5标签,低版本不支持,大小也有限制,大概5m左右
  2. cookie+setInterval
     
    // 设置定时任务来获取cokie里面的数据,去除自己想要的字段值
    setInterval(()=>{
      let getName = JSON.parse("{\"" + document.cookie.replace(/;\s+/gim,"\",\"").replace(/=/gim, "\":\"") + "\"}")[cokieName])
    }, 10000)

    cokie的存储空间有限,最多4k,每个域名下面最多能设置30-50个cokie
    每次http请求都会将cokie带到服务器,但服务器不用此数据,会浪费带宽,
    定时任务频率太大,影响浏览器性能,频率过小影响数据时效性

  3. websocket
    // server.js文件
    //获得WebSocketServer类型
    var WebSocketServer = require('ws').Server;
    //创建WebSocketServer对象实例,监听指定端口
    var wss = new WebSocketServer({ port: 8080 });
    //创建保存所有已连接到服务器的客户端对象的数组
    var clients=[]; 
    //为服务器添加connection事件监听,当有客户端连接到服务端时,立刻将客户端对象保存进数组中。
    wss.on('connection', function(client) {
      // 如果没有这个client对象,说明是第一次连接,就加入到clients中
      if(clients.indexOf(client)===-1){
        clients.push(client);
        //为每个client对象绑定message事件,当某个客户端发来消息时,自动触发
        client.on('message', function (msg) {
          //遍历clients数组中每个其他客户端对象,并发送消息给其他客户端
          for(var c of clients){
            if(c!=client){
              c.send(msg);
            }
          }
        })
      }
    })
    <!-- send.html文件 -->
    <body style="text-align: right">
      <input id="msg" type="text"> 
      <button id="send">发送</button>
      <script>
        //建立到服务端webSocket连接
        var ws = new WebSocket("ws://localhost:8080");
        send.onclick = function(){
          if(msg.value.trim()!==""){
            // 将消息发到服务器
            ws.send(msg.value.trim());
          }
        }
      </script>
    </body>
    <!-- receive.html文件 -->
    <body>
      <h1>收到消息:<span id="recMsg"></span></h1>
      <script>
        //建立到服务端webSocket连接
        var ws = new WebSocket("ws://localhost:8080");
        //当连接被打开时,注册接收消息的处理函数
        ws.onopen=function(event) {
          //当有消息发过来时,就将消息放到显示元素上
          ws.onmessage=function(event) {
            recMsg.innerHTML=event.data;
          }
        }
      </script>
    </body>

    需要后台支持才能实现websocket的功能,如果数据量很大的话,消耗服务器资源的严重。但是功能强大,灵活

  4. sharedworker
    //main1 和main2都是这样
    
    <!DOCTYPE HTML>
    <html>
    <head>
        <title>Shared workers: demo 2</title>
    </head>
    <body>
    <div id="log"></div>
    <input type="text" name="" id="txt">
    <button id="get">get</button>
    <button id="set">set</button>
    <script>
      var worker = new SharedWorker('shared.js');
      var get = document.getElementById('get');
      var set = document.getElementById('set');
      var txt = document.getElementById('txt');
      var log = document.getElementById('log');
    
      worker.port.addEventListener('message', function(e) {
        log.innerText = e.data;
      }, false);
      worker.port.start(); // note: need this when using addEventListener
    
      set.addEventListener('click',function(e){
          worker.port.postMessage(txt.value);
      },false);
    
      get.addEventListener('click',function(e){
          worker.port.postMessage();
      },false);
    </script>
    </body>
    </html>
    //shared
    var data;
    onconnect = function(e) {
      var port = e.ports[0];
      port.onmessage = function(e) {
        // 没有传入数据说明想获取数据,将data的数据返回去
        if(e.data==''){
            port.postMessage(data);
        }else{
            data=e.data;
        }
      }
    }

    SharedWorker的实质在于share,不同的线程可以共享一个线程,他们的数据也是共享的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值