Chrome 54 中的 API 弃用和移除

Joe Medley
Joe Medley

在几乎每个版本的 Chrome 中,我们都看到了针对产品及其性能的大量更新和改进,以及网络平台的功能。本文介绍了自 9 月 15 日起 Chrome 54(Beta 版)中的弃用和移除功能。此列表随时可能发生变化。

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

要点window.onunload 事件处理脚本中禁止所有跨源导航,以便让 Chrome 内嵌于 HTML 规范以及 Firefox 和 Safari 中。

意图移除 | Chromestatus Tracker | Chromium 错误

旧版 Chrome 允许在 window.onunload 内中断跨源导航。设置 window.location.href = '#fragment'根据 HTML 规范,卸载处理程序中仅允许使用页内导航,而在旧版 Chrome 中,其他导航方法已按照规范要求被屏蔽。从 Chrome 54 开始,系统将禁止此类导航以符合该规范以及 Firefox 和 Safari。

HTTP/0.9 已废弃

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

意图移除 | Chromestatus Tracker | Chromium 错误

HTTP/0.9 是 HTTP/1.x 的前身。它缺少后续产品的许多功能。现代 Web 的一大问题是缺乏响应标头。没有它们,便无法验证 HTTP/0.9 响应是否确实是 HTTP/0.9 响应。这可能会导致一些问题。包括但不限于以下问题:

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

解决 HTTP/0.9 相关问题的唯一可靠方法是彻底取消对 HTTP/0.9 的支持。因此,Chrome 54 不再支持 HTTP/0.9。

已停止使用“initTouchEvent

要点initTouchEvent 已弃用,取而代之的是 TouchEvent constructor,以更好地符合规范要求,并将在 Chrome 54 中彻底移除。

意图移除 | Chromestatus Tracker | Chromium 错误

很长一段时间,开发者就能够在 Chrome 中使用 initTouchEvent API 创建合成触摸事件。它们通常用于模拟触摸事件,以测试或自动化网站中的某些界面。从 Chrome 49 开始,这个已废弃的 API 会显示以下警告。

触摸事件警告
TouchEvent.initTouchEvent 已弃用,将于 2016 年 9 月左右在 M53 中移除。请改用 TouchEvent 构造函数。如需了解详情,请参阅 https://www.chromestatus.com/features/5730982598541312

除了不符合“触摸事件”规范之外,此更改是好的原因有很多。initTouchEvent 的 Chrome 实现与 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”,Android 上的 Chrome 会匹配并遇到此弃用。目前还无法将其移除,但由于 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 属性

要点:即将移除很少支持的 keyboardEvent.keyIdentifier 属性,改为使用基于标准的 KeyboardEvent.key 属性。

意图移除 | Chromestatus Tracker | Chromium 错误

在 2009 年和 2010 年,keyboardEvent.keyIdentifier 属性曾短暂地属于 W3C 规范。不过,它只在 WebKit 中实现。

需要替换此属性的开发者可以使用基于标准的 KeyboardEvent.key 属性或 KeyboardEvent.code 属性(如我们去年春季发布的一篇文章中所述)。前者在实现基础上最广泛,可在所有主流桌面浏览器(Safari 除外)上获得支持。Chrome、Firefox 和 Opera 目前支持后者。移除此功能旨在提高 KeyboardEvent.key 资源的采用率。Apple 没有关于是否支持此功能的消息;不过,Safari 上仍然提供已废弃(但尚未从 Chrome 中移除)的 KeyboardEvent.keyCodeKeyboardEvent.charCode 属性。

移除了 MediaStream 已结束事件和属性以及 onended 属性

要点:我们即将移除 ended 事件和属性以及 onended 事件处理脚本,因为这些事件已从媒体捕获和视频流规范中移除。

意图移除 | Chromestatus Tracker | Chromium 错误

大约三年来,ended 事件和 onended 事件处理脚本都没有纳入 WebRTC 规范。想要观看活动的开发者应使用 MediaStreamTracks 而非 MediaStreams

废弃了 SVGSVGElement.viewPort

此实现自 2012 年以来在 Chrome 中未成功实现。该属性在其他浏览器中根本不存在,并且已从规范中删除。出于上述原因,该属性将被弃用。我们预计会在 Chrome 55 中将其移除。

意图移除 | Chromestatus Tracker | Chromium 错误

废弃了 SVGViewElement.viewTarget

SVGViewElement.viewTarget 属性不属于 SVG2.0 规范,其使用率很低或不存在。此属性在 Chrome 54 中已废弃。我们预计会在 Chrome 56 中将其移除。

意图移除 | Chromestatus Tracker | Chromium 错误

移除了 SVGZoomEvent

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

意图移除 | Chromestatus Tracker | Chromium 错误