唯品秀前端博客
当前位置: 前端开发 > JavaScript > 实现浏览器多个页签之间通信-多种方法

今天用电脑浏览器上听酷狗音乐发现个有趣的交互,就是音乐的列表页面可以控制另一个打开的播放器页面,实现了浏览器垮页签通信,于是研究了下,最后结合网上资料,发现原来方法还不少。

1、localStorage

1
2
3
window.onstorage = (e) => {console.log(e)}
// 或者这样
window.addEventListener('storage', (e) => console.log(e))

这个应该比较好理解,就是做个存储监听,在localStorage.setItem(key, value) 添加(修改、删除)内容时候,同一个浏览器、域名、端口下的所有页签都能监听到onstorage的变化。

cookie+setInterval()

1
2
3
4
5
6
7
8
9
// 页签一
<script type="text/javascript">  
$(function(){    
    $("#btn").click(function(){    
       var ipt=$("#ipt").val();    
       document.cookie="name="+ipt;    
    });    
});  
</script>
1
2
3
4
5
6
7
8
9
10
11
// 页签二
<script type="text/javascript">  
    $(function(){  
        function getCookie(key) {    
            return JSON.parse("{"" + document.cookie.replace(/;\s+/gim,"","").replace(/=/gim, "":"") + ""}")[key];    
        }    
        setInterval(function(){    
            console.log("name=" + getCookie("name"));    
        }, 1000);    
    });  
</script>

SharedWorker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// A页面
<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <title>多个页面之间的通信</title>
</head>

<body>

    <div>
        <input type="text" class="input1">
        <button class="btn5">发送</button>
    </div>
    <div class="chat"></div>
    <script>
        var worker = new SharedWorker("test_worker2.js");
        worker.port.start();
        const ID = 122;
        worker.port.postMessage({ id: ID });
        var to_ws = function (data) {
            worker.port.postMessage([123, data]);
        };

        //接收woker的发送消息
        worker.port.onmessage = function (e) {
            chuli_xiaoxi(e.data[0], e.data[1]);
        };

        var ochat = document.querySelector(".chat");
        var oinput = document.querySelector(".input1");
        document.querySelector(".btn5").onclick = function () {
            var value = oinput.value;
            if (value) {
                chuli_xiaoxi(123, value);
                to_ws(value);
            };
        };
        var chuli_xiaoxi = function (id, data) {
            var odiv = document.createElement("div");
            if (id === 123) {
                odiv.style.color = "red";
            } else {
                odiv.style.color = "green";
            };
            odiv.innerHTML = id + "说: " + data;
            ochat.appendChild(odiv);
        };
    </script>
</body>

</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// B页面
<!DOCTYPE html>
<html lang="zh">

<head>
    <meta charset="UTF-8">
    <title>多个页面之间的通信</title>
</head>

<body>

    <div>
        <input type="text" class="input1">
        <button class="btn5">发送</button>
    </div>
    <div class="chat"></div>
    <script>
        var worker = new SharedWorker("test_worker2.js");
        worker.port.start();
        const ID = 123;
        worker.port.postMessage({ id: ID });
        var to_ws = function (data) {
            worker.port.postMessage([122, data]);
        };

        //接收woker的发送消息
        worker.port.onmessage = function (e) {
            chuli_xiaoxi(e.data[0], e.data[1]);
        };

        var ochat = document.querySelector(".chat");
        var oinput = document.querySelector(".input1");
        document.querySelector(".btn5").onclick = function () {
            var value = oinput.value;
            if (value) {
                chuli_xiaoxi(122, value);
                to_ws(value);
            };
        };
        var chuli_xiaoxi = function (id, data) {
            var odiv = document.createElement("div");
            if (id === 122) {
                odiv.style.color = "red";
            } else {
                odiv.style.color = "green";
            };
            odiv.innerHTML = id + "说: " + data;
            ochat.appendChild(odiv);
        };
    </script>
</body>

</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// test_worker2.js
var list = [];
var list_id = [];
onconnect = function (e) {
    var port = e.ports[0];
    port.addEventListener('message', function (e) {
        if (e.data.id) {
            var index = list_id.indexOf(e.data.id);
            if (index === -1) {
                list.push(port);
                list_id.push(e.data.id);
            } else {
                //关闭上个链接
                list[index].close();
                list[index] = port;
            };
        } else {
            send(e.data[1], e.data[0]);
        };
    });
    port.start();
}
var send = function (data, id) {
    var index = list_id.indexOf(id);
    if (index !== -1) {
        list[index].postMessage([id, data]);
    };

};

更多方式

其实还有其他方式,例如windows.opener,不过该方式有一定的使用局限性,可以自行了解。websocket自然更是可以的,而且应该说是最完美的,不过使用起来可能有些复杂。

小结

最开始我想到的是websocket协议,这个在之前文章中有说到过。但仔细想想酷狗这块应该用的不是websocket,最后研究一番,大致确认,酷狗是用的localStorage方式。

「梦想一旦被付诸行动,就会变得神圣,如果觉得我的文章对您有用,请帮助本站成长」

分享到:
赞(3) 打赏
谢谢你请我吃鸡腿*^_^*

支付宝扫一扫打赏

微信扫一扫打赏

标签:

上一篇:

下一篇:

相关推荐

1 条评论关于"实现浏览器多个页签之间通信-多种方法"

最新评论

  1. 杜老师说
    iPhone Safari 604.1

    杜老师说到此一游,期待回访!

  2. 暂无留言哦~~

博客简介

一个关注Web前端开发技术、关注用户体验、坚持更多原创实战教程的个人网站,梦想一旦被付诸行动,就会变得神圣,愿景:成为宇宙中最具有代表性的前端技术类博客。主题源码 

精彩评论

友情链接

他们同样是一群网虫,却不是每天泡在网上游走在淘宝和网游之间、刷着本来就快要透支的信用卡。他们或许没有踏出国门一步,但同学却不局限在一国一校,而是遍及全球!申请交换友链

站点统计

  • 文章总数: 276 篇
  • 草稿数目: 0 篇
  • 分类数目: 15 个
  • 独立页面: 7 个
  • 评论总数: 976 条
  • 链接总数: 11 个
  • 标签总数: 474 个
  • 注册用户: 2 人
  • 访问总量: 8,755,682 次
  • 最近更新: 2020年11月26日
服务热线:
 173xxxx7240

 QQ在线交流

 旺旺在线