在几乎每个版本的 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 会显示以下警告。
除了不符合“触摸事件”规范之外,此更改是好的原因有很多。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.keyCode
和 KeyboardEvent.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 中无法正常运行。尽管该功能仍具有可检测性,但可能会让开发者感到困惑。系统会将其移除。