原子
@xNedKx
Tue, Jul 6, 2021 11:54 AM
Tue, Jul 6, 2021 12:01 PM
試著用 service worker 碰到一個現象。
首先在原始頁面註冊一個其子路徑的 sw (這樣原始頁面不會受到 sw 的影響),然後嵌入一個該領域路徑下的 iframe 觸發 sw 的 activate 來 claim 頁面。
預想情況是, iframe 的內容會受 sw 影響,而原始頁面能夠經由 iframe 的 navigator.serviceWorker.controller 與 sw 通訊。
實際結果 iframe 的確有被 claim ,內容也受到 sw 的控制, sw 的 claim 清單裡也有這個項目,但是 navigator.serviceWorker.controller 仍舊是 null 。
據說 iframe 會繼承原始頁面的 controller ,是因為這個原因嗎?
原子
@xNedKx
Tue, Jul 6, 2021 11:59 AM
無法取得 sw 的 global scope 的話,就不能用 postmessage 通訊了
在原始頁面 fetch 領域路徑下的資源是不會觸發 sw 的,因為原始頁面不在領域內
原子
@xNedKx
Tue, Jul 6, 2021 12:06 PM
另外在觸發 active 的當下,執行 await clients.claim 後用 await clients.matchAll 讀到的清單是空的,這點還不太懂原因。
原子
@xNedKx
Tue, Jul 6, 2021 12:18 PM
似乎是因為 active 的當下,請求的視窗還不存在的關係..?
原子
@xNedKx
Tue, Jul 6, 2021 12:20 PM
activate event 看起來沒有傳遞可以讀取觸發 window 的資訊
原子
@xNedKx
Tue, Jul 6, 2021 4:01 PM
很奇妙的,在我的開發環境下 activate 時 await clients.claim 之後用 setTimeout 等大概 10ms 就能讀到觸發 activate 的 client 頁面了
載入新的回覆
首先在原始頁面註冊一個其子路徑的 sw (這樣原始頁面不會受到 sw 的影響),然後嵌入一個該領域路徑下的 iframe 觸發 sw 的 activate 來 claim 頁面。
預想情況是, iframe 的內容會受 sw 影響,而原始頁面能夠經由 iframe 的 navigator.serviceWorker.controller 與 sw 通訊。
實際結果 iframe 的確有被 claim ,內容也受到 sw 的控制, sw 的 claim 清單裡也有這個項目,但是 navigator.serviceWorker.controller 仍舊是 null 。
據說 iframe 會繼承原始頁面的 controller ,是因為這個原因嗎?
在原始頁面 fetch 領域路徑下的資源是不會觸發 sw 的,因為原始頁面不在領域內