Chrome 54 中的 API 弃用和移除

在几乎每个版本的 Chrome 中,我们都会看到产品、性能以及 Web 平台功能方面有大量更新和改进。本文介绍了 Chrome 54 中的弃用和移除项,该版本截至 9 月 15 日仍处于 Beta 版阶段。此列表随时可能会发生变化。

在卸载处理程序中停用导航

总结:所有跨源导航都将在 window.onunload 事件处理程序中被禁止,以使 Chrome 与 HTML 规范以及 Firefox 和 Safari 保持一致。

移除意向 | Chromestatus 跟踪器 | Chromium Bug

之前的 Chrome 版本允许在 window.onunload 内中断跨源导航。通过设置 window.location.href = '#fragment' 实现。根据 HTML 规范,卸载处理程序中仅允许进行页面内导航,并且在之前的 Chrome 版本中,其他导航方法会按照规范要求被阻止。从 Chrome 54 开始,此类导航将被禁止,以便与规范以及 Firefox 和 Safari 保持一致。

HTTP/0.9 已弃用

总结:HTTP/0.9 已被弃用。开发者应改用更高版本,最好是 HTTP/2。

移除意向 | Chromestatus 跟踪器 | Chromium Bug

HTTP/0.9 是 HTTP/1.x 的前身。它缺少许多后续版本的功能。现代 Web 的一个特别令人担忧的问题是缺少响应标头。如果没有这些标头,就无法验证 HTTP/0.9 响应是否真的是 HTTP/0.9 响应。这可能会导致一些问题。例如,除其他问题外,还包括:

  • 将某些错误响应视为有效的 HTTP/0.9 响应的客户端。
  • 未能关闭请求套接字的服务器会导致客户端将响应视为挂起的 GET,该 GET 会永久保持活动状态,或者直到用户离开发出请求的网页。
  • 无法向浏览器表明请求失败的服务器,这可能会导致缓存启发法出现问题。

解决 HTTP/0.9 问题的唯一万无一失的方法是完全移除支持。因此,Chrome 54 中移除了对 HTTP/0.9 的支持。

已移除 initTouchEvent 的使用

总结initTouchEvent已被弃用,取而代之的是 TouchEvent constructor,以提高规范合规性,并且将在 Chrome 54 中完全移除。

移除意向 | Chromestatus 跟踪器 | Chromium Bug

长期以来,开发者一直能够使用 initTouchEvent API 在 Chrome 中创建合成触控事件。这些事件经常用于模拟触摸事件,以便测试或自动执行网站中的某些界面。自 Chrome 49 以来,此已弃用的 API 会显示以下警告。

触摸事件警告
TouchEvent.initTouchEvent 已弃用,将在 M53(大约在 2016 年 9 月)中移除。请改用 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);

这很糟糕,因为该代码会在 User-Agent 中查找“Android”,而 Android 上的 Chrome 会匹配并命中此弃用。不过,目前还无法移除它,因为在一段时间内,Android 上仍会有其他基于 WebKit 和旧版 Blink 的浏览器,您仍需要支持旧版 API。

为了正确处理网页上的 TouchEvent,您应该更改代码以支持 Firefox、IE Edge 和 Chrome,方法是检查 window 对象上是否存在 TouchEvent,如果存在且“length”为正值(表示它是一个接受实参的构造函数),您应该使用该构造函数。

    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 Bug

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

总结ended 事件和属性以及 onended 事件处理程序将被移除,因为它们已从 Media Capture and Streams 规范中移除。

移除意向 | Chromestatus 跟踪器 | Chromium Bug

ended 事件和 onended 事件处理程序大约三年前就已不再是 WebRTC 规范的一部分。想要观看事件的开发者应使用 MediaStreamTracks,而不是 MediaStreams

弃用了 SVGSVGElement.viewPort

自 2012 年以来,该实现一直无法在 Chrome 中正常运行。该属性在其他浏览器中根本不存在,因此已从规范中移除。因此,我们即将弃用该属性。预计会在 Chrome 55 中移除。

移除意向 | Chromestatus 跟踪器 | Chromium Bug

弃用了 SVGViewElement.viewTarget

SVGViewElement.viewTarget 属性不属于 SVG2.0 规范,使用率很低或根本没有。此属性已在 Chrome 54 中弃用。预计会在 Chrome 56 中移除。

移除意向 | Chromestatus 跟踪器 | Chromium Bug

移除 SVGZoomEvent

SVGZoomEvent 不属于 SVG2.0 规范,在 Chromium 中无法正常运行。尽管如此,该功能仍可被检测到,可能会让开发者感到困惑。该功能将被移除。

移除意向 | Chromestatus 跟踪器 | Chromium Bug