異動事件將從 Chrome 中移除

我們將於 2024 年 7 月宣布淘汰異動和預計移除異動事件,並說明可以在 2024 年 7 月移除程式碼前如何遷移程式碼。

Mason Freed
Mason Freed

Chromium 已正式淘汰異動事件,並規劃從 127 版開始停止支援的版本,該計畫將於 2024 年 7 月 23 日推出穩定版。本文將說明我們移除變動事件的原因,並提供遷移方法,讓您在這些事件從瀏覽器中移除之前。

什麼是變動事件?

變動事件是下列事件集合的名稱:

  • DOMNodeInserted
  • DOMNodeRemoved
  • DOMSubtreeModified
  • DOMCharacterDataModified
  • DOMNodeInsertedIntoDocument
  • DOMNodeRemovedFromDocument
  • (任何新版瀏覽器都不支援) DOMAttrModified
  • (任何新版瀏覽器都不支援) DOMAttributeNameChanged
  • (任何新版瀏覽器都不支援) DOMElementNameChanged

這些事件是 DOM 級別 2 規格中非常舊的部分,且自 2011 年起已淘汰。由 MutationObserver 介面取代,自 2013 年起,所有新式瀏覽器都支援

異動事件記錄

很久以前,變更事件聽起來是個好主意,但後來後的結果是數個嚴重瑕疵

  • 牠們很冗長和火勢過來。每個移除的節點都會觸發事件。
  • 由於事件傳播,並使通用 Analytics 執行階段最佳化無法進行多項最佳化作業,因此速度較慢
  • 經常造成當機。因為事件監聽器可以變更執行中的 DOM 作業底下的整個 DOM,因此這些錯誤確實是瀏覽器中許多當機和安全性錯誤的來源。

由於有這些瑕疵,事件已在 2011 年從規格中淘汰,並在 2012 年建構替換的 API (MutationObserver)。目前,新版 API 的建置及運作功能已有超過 10 年的時間。

移除變動事件的原因

對異動事件的支援會因瀏覽器而異。有些瀏覽器不支援 DOMNodeInsertedIntoDocumentDOMNodeRemovedFromDocument 等部分事件。至於其他事件,由於缺少任何同意的規格,這個特定行為會有所不同。不過,一個合理的問題可能是:既然他們「完成」了,也不必離開該場。是否會導致網頁速度變慢?答案分為兩部分。

首先,這些事件會先令網路平台興起。隨著網路環境的發展和加入新的 API,您也必須將這些舊版 API 的存在納入考量。有時候,只需要支援這些事件時,可能會導致無法建議新的 API。舉例來說,有一個長期要求,避免 <iframe> 元素在移動至 DOM 時重新載入。然而,部分原因在於有變動事件,一般認為難以達成,要求已關閉。

這類事件不斷擴大瀏覽器運作速度。即使瀏覽器已完成最佳化作業,也試圖避免使用異動事件的網頁效能降低,但仍有不盡完美之處。許多位置仍需要進行檢查,以便使用 Mutation Event 事件監聽器。程式碼仍需以最具防禦力的方式編寫,因為這類事件可能會以驚人的方式變更 DOM。

由於活動遭到正式淘汰超過 10 年,替代 API 的運作也已 10 年以上,如今終於越來越不得不從瀏覽器中移除變動事件。

如何遷移

改用 MutationObserver

MutationObserver 說明文件位於 MDN 上,且完整內容完整。程式碼集的替換方式取決於這些事件的使用方式,但例如:

// Old mutation event usage:  
target.addEventListener('DOMNodeInserted',event => doSomething(event.target));

// Replacement mutation observer code:  
const observer = new MutationObserver(mutationList =>  
  mutationList.filter(m => m.type === 'childList').forEach(m => {  
    m.addedNodes.forEach(doSomething);  
  }));  
observer.observe(target,{childList: true, subtree: true});  

雖然 MutationObserver 程式碼看起來比原始 DOMNodeInserted 事件監聽器程式碼大,但請注意,它可以處理在單一呼叫中整個樹狀結構發生的所有異動,無須對事件處理常式多次呼叫。

聚合物

會有 polyfill 嘗試允許現有程式碼在 MutationObserver 技術下持續運作。polyfill 位於 GitHub 或 npm 套件中。

時間表和淘汰試用資訊

我們將在 2024 年 7 月 23 日為所有使用者*從 Chrome 127 中移除變更事件*,並將於 2024 年 7 月 23 日推出穩定版。提前警告,這類活動會提前從 Canary、開發人員版和 Beta 版中移除。

  • 如果您需要更多時間 (2024 年 7 月之後) 遷移程式碼,請採用淘汰試用期,暫時在指定網站上重新啟用活動。另外還有一項名為 MutationEventsEnabled企業政策,其功能與企業版使用者類似。無論您選擇哪一個選項,都會視需要預留大約九個月的遷移時間。