共 1 条评论关于"实现浏览器多个页签之间通信-多种方法"
最新评论
今天用电脑浏览器上听酷狗音乐发现个有趣的交互,就是音乐的列表页面可以控制另一个打开的播放器页面,实现了浏览器垮页签通信,于是研究了下,最后结合网上资料,发现原来方法还不少。
1 2 3 |
这个应该比较好理解,就是做个存储监听,在localStorage.setItem(key, value) 添加(修改、删除)内容时候,同一个浏览器、域名、端口下的所有页签都能监听到onstorage的变化。
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 |
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方式。
最新评论
支付宝扫一扫打赏
微信扫一扫打赏
杜老师说到此一游,期待回访!