写点什么

Google 最终决定让指针事件成为 Chrome 的主要事件类型

  • 2015-04-16
  • 本文字数:1520 字

    阅读完需:约 5 分钟

Google 决定让指针事件(Pointer Events)成为 Chrome 的主要事件类型,抛弃苹果,加入微软和 Firefox 的阵营。

去年,Chrome 和 Blink 输入团队负责人 Rick Byers 曾宣称 Blink/Chrome 不会实现指针事件(PE),尽管Google 很久之前就已加入相关工作组。Byers 提到了一系列原因,包括Apple 对于PE 的反对会影响它的普及程度、给标准16ms 帧预算带来大约2% 的性能损耗以及在滚动时无法处理事件。 Google 甚至把他们的 PE polyfill 库托管给 jQuery 基金会

但是“持续收到的反馈表示,web 开发者、框架作者和其他浏览器开发商认为指针事件对于平台来说具有很大价值”, Byers 最近宣布Chrome 将实现 PE,可以通过某个标记开启。 Chromium 官网的一个新issue 显示,PE 相关的工作已经开始。此外, Byers 和微软的 PE 团队已经就上文提到的性能问题进行讨论,这将涉及到一些 API 的改动。

我们就此事进一步的发展采访了 Byers。

InfoQ:请问你准备如何处理同时支持两种事件类型的设备?是否会像这个文档中建议的那样把所有的 TE(触摸事件)都转换成 PE?

RB:如果我们提供了对 PE 的支持,那么指针事件就会成为主要的事件类型。如果一个指针事件没有被处理,那它就可能会触发一个触摸和 / 或鼠标事件。幸运的是,我们从 IE 提高移动 web 兼容性中(通过支持触摸事件)学到了很多。我很赞同 IE 工程师们的设计,我们也准备在 Chrome 中采用类似的设计,一些特殊的地方除外(当然在具体实现的时候我们可能会修改一些细节)。

InfoQ:微软的 Jacob Rossi表示他愿意协助你修复 PE 中可能存在的问题,但是在 W3C 中 PE 的规范已经成为了最终标准,据我所知现在只能对其进行细微的调整。你准备怎么做?

RB:在收到一些重要的反馈之后,关于新版 PE 规范的工作已经启动,(Rossi 提到的)不过是向新版 PE 规范中再加入一件(显然更大的)事而已。确保改动能兼容现有代码确实是一项巨大的挑战,但是我相信我们可以在兼容性和解决问题之间做出某种合理的权衡。

InfoQ:请解释一下为什么“默认不捕获的触摸输入模型会影响引擎性能”?

RB:区别在于哪个 DOM 节点接收‘移动’事件。对于触摸,触摸 - 移动事件的目标节点总是收到触摸 - 开始事件的元素(这是“隐式捕获”)。对于鼠标和(默认的)指针事件,目标总是当前指针所指的元素。这意味着每次移动鼠标,浏览器都需要通过“命中测试”来确定当前指针指向的元素。由于 CSS 布局的复杂性,命中测试也很复杂,有时很难预测其性能。从浏览器引擎开发者的角度来说,如何减少每个“帧预算”的工作量是我们面临的最大的性能挑战。响应触摸移动事件时,浏览器和应用可以通过 16ms 一次的事件来保证流畅的 60fps 体验。但是,尽管命中测试(在简单的用例中)只占帧预算的大约 2%,这仍然是一个不可忽视的代价。我们认为这种代价不应当由平台承担,除非开发者们明确地表示他们需要“不捕获”行为。

现在许多网站的设计方式都是“触摸优先”,因为开发者们都意识到优秀的移动用户体验能够有效提高用户参与度。我认为所有新出现的输入 API 都应该考虑到这一点并优先考虑直接操作(捕获),从而满足现代的用户交互。

Google 计划在所有支持平台的 Chrome 中实现 PE,包括 Android 和 WebView。PE 也会在 Spartan/IE10、Firefox(需要通过 flag 开启)、jQuery 和 Dojo 中实现。Apple 是目前唯一一家反对PE 的主流浏览器开发商。

查看英文原文: Google Is Going to Make Pointer Events the Main Event Type in Chrome after All


感谢邵思华对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流。

2015-04-16 08:543940

评论

发布
暂无评论
发现更多内容

对待一件事,从不喜欢再到喜欢,转变需要多大

良知犹存

程序人生

gRPC在Spring Cloud中的应用

xcbeyond

Java gRPC SpringCloud

SpringCloud(Netflix)-技术专题-微服务入门介绍

码界西柚

优化教育体验 智微智能高品质录播系统

InfoQ_967a83c6d0d7

全球移动服务生态的暗涌与新机

脑极体

为什么使用Portainer,而不是Docker CLI来管理Docker环境

xcbeyond

Docker 运维 Portainer

「C++ 篇」答应我,别再 if else 走天下了可以吗

小林coding

c++ 编程 设计模式 编程习惯 编程风格

2020大厂web前端面试常见问题总结

华为云开发者联盟

CSS 面试 响应式 大前端 浏览器

修改系统时间,导致 sem_timedwait 一直阻塞的问题解决和分析

小林coding

Linux 编程 问题处理

直播技术的背后--RTMP协议

soolaugust

直播 RTMP

音画同步体验有多好,来看看即构的自研互动白板就知道啦

ZEGO即构

在线教育 SVG canvas

HTTP协议-进阶

Jaykey

大前端 HTTP

C++ 深入浅出工厂模式(进阶篇)

小林coding

c++ 设计模式 工厂模式

Web 全栈开发利器: 强大的在线 Cloud IDE

华为云开发者联盟

Web python3.x 全栈 编码 CloudIDE

HTTP协议-基础

Jaykey

大前端 HTTP

让类/进程/脚本「单身」的方法

小林coding

c c++ Shell 设计模式 单例模式

为什么你做的 Excel 表不好用?

Tony Wu

效率工具 产品设计 Excel ER图

Newbe.Claptrap 框架如何实现在多种框架之上运行?

newbe36524

Docker 云计算 微服务 .net core ASP.NET Core

Spring Boot Actuator微服务服务监控

xcbeyond

Java 微服务 springboot actuator 服务监控

老张「原创小说」

瓜藤老祖

个人成长

精美前端UI(VUE)界面,ASP.NET通用工作流开发分享

雯雯写代码

工作流 可视化

国内首家 ABM 营销技术服务商火眼云完成5000万元A轮融资

人称T客

字节跳动想招什么样的技术人?

池建强

从根上学习Git

书旅

git 工具 版本控制 版本管理工具

大数据技术发展(一):大数据技术的起源

cristal

Java 大数据 hadoop

超超超全递归技巧讲解,这次带你拿下递归

多选参数

数据结构 算法 递归 数据结构与算法

C++ this指针的理解和作用

小林coding

c c++ 指针

误执行 rm -fr /*,我删删删删库了,要跑路吗?

小林coding

Linux 程序人生 Shell linux命令

为什么直播系统不用RTP协议

soolaugust

WebRTC 直播 RTMP rtp

第二次推荐笔记:wolai

申屠鹏会

C++ 深入浅出工厂模式(初识篇)

小林coding

c++ 设计模式 工厂模式

Google最终决定让指针事件成为Chrome的主要事件类型_Google_Abel Avram_InfoQ精选文章