Chrome 54 淘汰和移除 API

喬梅利
Joe Medley

在絕大多數的 Chrome 版本中,我們都會發現主要的更新和改善項目,包含產品、效能和網路平台功能。本文說明 Chrome 54 將於 9 月 15 日推出的 Beta 版淘汰和移除功能。這份清單隨時可能有所變動。

在卸載處理常式中停用導覽功能

TL;DR:window.onunload 事件處理常式將禁止所有跨來源瀏覽,也就是讓 Chrome 內嵌至 HTML 規格、Firefox 和 Safari。

意圖移除 | Chrome 狀態追蹤工具 | Chromium 錯誤

舊版 Chrome 允許在 window.onunload 內中斷跨來源瀏覽。只要設定 window.location.href = '#fragment'即可。根據 HTML 規格,卸載處理常式僅允許使用網頁內瀏覽功能,而在舊版 Chrome 中,其他的導覽方法已根據規格加以封鎖。自 Chrome 54 版起,我們不得按照規格、Firefox 和 Safari 等瀏覽器導入這類瀏覽功能。

HTTP/0.9 已淘汰

TL;DR:HTTP/0.9 已淘汰。開發人員應升級至較新版本,建議使用 HTTP/2。

意圖移除 | Chrome 狀態追蹤工具 | Chromium 錯誤

HTTP/0.9 是 HTTP/1.x 的前身。但缺乏後續的許多特色。現代網路有一個問題,就是缺乏回應標頭。如果沒有 Cookie,就無法驗證 HTTP/0.9 回應是否確實是 HTTP/0.9 回應。這可能會造成一些問題。這類問題包括:

  • 將特定錯誤回應視為有效 HTTP/0.9 回應的用戶端。
  • 伺服器無法關閉要求通訊端,導致用戶端將回應視為等待的 GET,而該 GET 會永久留在線上,或直到使用者從提出要求的網頁開始瀏覽為止。
  • 無法向瀏覽器指出要求失敗的伺服器,這可能導致快取經驗法則發生問題。

修正 HTTP/0.9 問題的唯一可證方法,就是完全移除支援。因此,Chrome 54 版不再支援 HTTP/0.9。

已移除使用 initTouchEvent

TL;DRinitTouchEvent 已淘汰,並改用 TouchEvent constructor 以改善規格法規遵循,並將在 Chrome 54 版中完全移除。

意圖移除 | Chrome 狀態追蹤工具 | Chromium 錯誤

長期以來,開發人員都能夠使用 initTouchEvent API,在 Chrome 中建立合成觸控事件。這些函式經常用於模擬觸控事件,以便測試或自動化網站中的部分 UI。自 Chrome 49 版起,這個已淘汰的 API 會顯示下列警告 。

觸控事件警告
TouchEvent.initTouchEvent 已淘汰,並將於 2016 年 9 月左右從 M53 中移除。請改用 TouchEvent 建構函式。詳情請參閱 https://www.chromestatus.com/features/5730982598541312

除了屬於觸控事件規格外,還有許多原因都可能導致這項變更。Chrome 的 initTouchEvent 實作與 Safari 的 initTouchEvent API 完全不相容,與 Android 裝置上的 Firefox 不同。最後,TouchEvent 建構函式變得更容易使用。

基於這些原因,我們決定遵循規格,而非維護既不受監護也與唯一實作相容的 API。需要替代方案的開發人員應使用 TouchEvent 建構函式。

由於 initTouchEvent API 在 iOS 和 Android/Chrome 的實作方式差異甚大,網站通常會在以下幾行執行程式碼 (經常忘記 Firefox)

    var event = document.createEvent('TouchEvent');
    
    if(ua === 'Android') {
      event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
        300, 300, 200, 200, false, false, false, false);
    } else {
      event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
        200, false, false, false, false, touches, targetTouches, changedTouches, 0, 0);
    }
    
    document.body.dispatchEvent(touchEvent);

這項淘汰作業只是在使用者代理程式和 Android 版 Chrome 中尋找「Android」,因此發生了同樣的問題。目前無法移除這個 API,因為 Android 上還會有其他採用 WebKit 及舊版 Blink 的瀏覽器,一段時間內仍需支援舊版 API。

如要正確處理網路上的 TouchEvent,您應變更程式碼,以支援 Firefox、IE Edge 和 Chrome,方法是檢查 window 物件中是否存在 TouchEvent,以及其長度是否為正「長度」(表示這是接受引數的建構函式)。

    if('TouchEvent' in window && TouchEvent.length > 0) {
      var touch = new Touch({
        identifier: 42,
        target: document.body,
        clientX: 200,
        clientY: 200,
        screenX: 300,
        screenY: 300,
        pageX: 200,
        pageY: 200,
        radiusX: 5,
        radiusY: 5
      });
    
      event = new TouchEvent("touchstart", {
        cancelable: true,
        bubbles: true,
        touches: [touch],
        targetTouches: [touch],
        changedTouches: [touch]
      });
    }
    else {
      event = document.createEvent('TouchEvent');
    
      if(ua === 'Android') {
        event.initTouchEvent(touchItem, touchItem, touchItem, "touchstart", window,
          300, 300, 200, 200, false, false, false, false);
      } else {
        event.initTouchEvent("touchstart", false, false, window, 0, 300, 300, 200,
          200, false, false, false, false, touches, targetTouches, 
          changedTouches, 0, 0);
      }
    }
    
    document.body.dispatchEvent(touchEvent);

已移除 KeyboardEvent.keyIdentifier 屬性

TL;DR:移除較少支援的 keyboardEvent.keyIdentifier 屬性,並改用標準式 KeyboardEvent.key 屬性。

意圖移除 | Chrome 狀態追蹤工具 | Chromium 錯誤

keyboardEvent.keyIdentifier 屬性在 2009 和 2010 年暫時是 W3C 規格的一部分。但這一次從未在 WebKit 中實作。

需要替換這項屬性的開發人員可以使用標準式 KeyboardEvent.key 屬性或 KeyboardEvent.code 屬性 (如我們上一次春季文章所述)。前者的實作基礎最高,支援所有主要電腦版瀏覽器 (Safari 除外)。目前版本目前支援 Chrome、Firefox 和 Opera。移除這項功能是為了提高 KeyboardEvent.key 資源採用率。Apple 不再提供相關支援這項功能,但也已淘汰 (但尚未從 Chrome 中移除) KeyboardEvent.keyCodeKeyboardEvent.charCode 屬性仍適用於 Safari。

移除 MediaStream 結束事件、屬性和生效屬性

重點摘要:ended 事件、屬性和 onended 事件處理常式已遭移除,因為這些處理常式已從媒體擷取和串流規格中移除。

意圖移除 | Chrome 狀態追蹤工具 | Chromium 錯誤

大約三年內,ended 事件和 onended 事件處理常式都未納入 WebRTC 規格。想要觀看事件的開發人員應使用 MediaStreamTracks,而非 MediaStreams

淘汰 SVGElement.viewPort

自 2012 年起,Chrome 無法採用這項實作技術。其他瀏覽器中完全不會出現這個屬性,因此該屬性已從規格中移除。基於這些原因,屬性已遭淘汰。Chrome 55 預計會移除這項功能。

意圖移除 | Chrome 狀態追蹤工具 | Chromium 錯誤

淘汰 SVGViewElement.viewTarget

SVGViewElement.viewTarget 屬性不屬於 SVG2.0 規格,而且用量太小或不存在。這項屬性已在 Chrome 54 版中淘汰。Chrome 56 預計會移除這項功能。

意圖移除 | Chrome 狀態追蹤工具 | Chromium 錯誤

移除 SVGZoomEvent

SVGZoomEvent 不屬於 SVG2.0 規格的一部分,無法在 Chromium 中運作。但仍可偵測,可能會造成開發人員混淆。系統將移除這個位址。

意圖移除 | Chrome 狀態追蹤工具 | Chromium 錯誤