Chrome 54 淘汰和移除 API

在幾乎每個 Chrome 版本中,我們都會看到產品、效能和 Web 平台功能有大量更新和改良。本文說明 Chrome 54 (9 月 15 日推出 Beta 版) 中淘汰和移除的項目。這份清單隨時可能有所變動。

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

TL;DR:為使 Chrome 與 HTML 規格以及 Firefox 和 Safari 保持一致,系統將禁止 window.onunload 事件處理常式中的所有跨來源導覽。

移除意圖 | Chromestatus 追蹤工具 | Chromium 錯誤

舊版 Chrome 允許在 window.onunload 中中斷跨原始來源導覽作業。設定 window.location.href = '#fragment'根據 HTML 規格,卸載處理常式只允許網頁內導覽,而 Chrome 先前版本會根據規格封鎖其他導覽方法。自 Chrome 54 起,這類導覽將不允許,以符合規格以及 Firefox 和 Safari 的做法。

HTTP/0.9 已淘汰

重點摘要:HTTP/0.9 已淘汰。開發人員應改用較新版本,最好是 HTTP/2。

移除意圖 | Chromestatus 追蹤工具 | Chromium 錯誤

HTTP/0.9 是 HTTP/1.x 的前身。因此缺少後續機型具備的許多功能。現代網路的一大問題是缺少回應標頭。如果沒有這些標頭,就無法驗證 HTTP/0.9 回應是否真的是 HTTP/0.9 回應。這可能會導致多項問題。例如:

  • 將特定錯誤回應視為有效 HTTP/0.9 回應的用戶端。
  • 伺服器無法關閉要求 Socket,導致用戶端將回應視為懸而未決的 GET,這類要求會無限期保持有效,或直到使用者離開發出要求的網頁為止。
  • 伺服器無法向瀏覽器指出要求失敗,這可能會導致快取啟發式演算法發生問題。

如要徹底解決 HTTP/0.9 的問題,唯一方法是完全移除支援功能。因此,Chrome 54 版已移除對 HTTP/0.9 的支援。

已移除「initTouchEvent」的使用權

TL;DRinitTouchEvent 已淘汰,並改用 TouchEvent constructor,以提升 規格相容性,並將在 Chrome 54 中完全移除。

移除意圖 | Chromestatus 追蹤工具 | Chromium 錯誤

長期以來,開發人員都能在 Chrome 中使用 initTouchEvent API 建立合成觸控事件。這些事件通常用於模擬觸控事件,以測試或自動化網站中的某些 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 建構函式。

由於 iOS 和 Android/Chrome 實作的 initTouchEvent API 差異極大,網站通常會採用類似下列的程式碼 (經常忘記 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);

這項做法不妥,因為系統會在 User-Agent 中尋找「Android」,而 Android 上的 Chrome 會比對並觸發這項淘汰作業。不過,由於 Android 上仍有其他 WebKit 和舊版 Blink 瀏覽器,您仍需支援舊版 API,因此目前無法移除。

如要在網路上正確處理 TouchEvent,請檢查 window 物件上是否存在 TouchEvent,並確認該物件是否具有正向「長度」(表示該物件是接受引數的建構函式),然後使用該物件,藉此支援 Firefox、IE Edge 和 Chrome。

    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 屬性

簡而言之:我們將移除支援度不高的 keyboardEvent.keyIdentifier 屬性,改用以標準為基礎的 KeyboardEvent.key 屬性。

移除意圖 | Chromestatus 追蹤工具 | Chromium 錯誤

keyboardEvent.keyIdentifier 屬性在 2009 年和 2010 年曾短暫納入 W3C 規格。不過,這項功能只在 WebKit 中實作。

如要取代這項屬性,開發人員可以使用以標準為基礎的 KeyboardEvent.key 屬性或 KeyboardEvent.code 屬性 (如我們去年春季發布的文章所述)。前者是實作範圍最廣的技術,除了 Safari 之外,所有主要電腦版瀏覽器都支援這項技術。後者目前支援 Chrome、Firefox 和 Opera。移除這項功能是為了推動採用 KeyboardEvent.key 資源。Apple 尚未說明是否會支援這項功能,但 Safari 仍提供已淘汰 (但尚未從 Chrome 移除) 的 KeyboardEvent.keyCodeKeyboardEvent.charCode 屬性。

移除 MediaStream 結束事件和屬性,以及 onended 屬性

TL;DR:ended 事件和屬性以及 onended 事件處理常式已從 Media Capture and Streams 規格中移除,因此也將一併移除。

移除意圖 | Chromestatus 追蹤工具 | Chromium 錯誤

ended 事件和 onended 事件處理常式已從 WebRTC 規格中移除約三年。如要監看事件,開發人員應使用 MediaStreamTracks,而非 MediaStreams

淘汰 SVGSVGElement.viewPort

自 2012 年起,這項實作方式就無法在 Chrome 中運作。其他瀏覽器完全沒有這個屬性,因此規格已將其移除。基於上述原因,我們將淘汰這項屬性。預計會在 Chrome 55 中移除。

移除意圖 | Chromestatus 追蹤工具 | Chromium 錯誤

淘汰 SVGViewElement.viewTarget

SVGViewElement.viewTarget 屬性不屬於 SVG2.0 規格,而且使用率很低或根本沒有。Chrome 54 版已淘汰這項屬性。預計在 Chrome 56 版中移除。

移除意圖 | Chromestatus 追蹤工具 | Chromium 錯誤

移除 SVGZoomEvent

SVGZoomEvent 不屬於 SVG2.0 規格,且無法在 Chromium 中運作。但這項功能仍可偵測,可能會造成開發人員混淆。系統會移除該項目。

移除意圖 | Chromestatus 追蹤工具 | Chromium 錯誤