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時就會觸發。html
注意webworker沒法在本地使用,出於瀏覽器自己的安全機制,因此我此次的示例也是放在服務器上的,worker.js
和index.html
在同一目錄。 html5
由於客戶端和webworker端的通訊不像websocket那樣是全雙工的,因此客戶端發送數據和接收數據要分紅兩步來處理。示例中會有兩個按鈕,分別對應的向sharedWorker發送數據的請求以及獲取數據的請求,但他們本質上都是相同的事件--發送消息。web
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的數據。