window.onstorage = (e) => {console.log(e)} // 或者这样 window.addEventListener(‘storage‘, (e) => console.log(e))
localStorage.setItem(‘a‘, ‘b‘)
代码,同样是不会触发监听函数的。new Worker()
即可创建,这种webworker是当前页面专有的。然后还有种共享worker(SharedWorker),这种是可以多个标签页、iframe共同使用的,接下来介绍如何使用SharedWorker实现标签页之间的通信。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时就会触发。
注意webworker无法在本地使用,出于浏览器本身的安全机制,所以我这次的示例也是放在服务器上的,worker.js
和index.html
在同一目录。
因为客户端和webworker端的通信不像websocket那样是全双工的,所以客户端发送数据和接收数据要分成两步来处理。示例中会有两个按钮,分别对应的向sharedWorker发送数据的请求以及获取数据的请求,但他们本质上都是相同的事件--发送消息。
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‘)
window.worker.port.postMessage(‘get‘)
,即可收到页面A发送给worker的数据。
实现多个标签页之间通信的几种方法(sharedworker)
原文:https://www.cnblogs.com/cangqinglang/p/10635707.html