随着越来越多的公司进军移动领域,触摸事件已成为 Web 开发人员关注的热门话题。我们大多数人知道触摸事件支持单点和多点触摸跟踪。我们中有些人知道同时使用触摸和鼠标的棘手之处。更少的人知道有多种触摸事件模型,而尝试同时支持多种模型的人就更少了。我想谈谈我们今天所处的位置,我们是如何走到今天这一步的,以及我们将来可能面临的潜在问题。
简史
早在 2007 年,苹果公司推出了 iPhone,随之而来的是触摸事件。Neil Roberts 在 SitePen 文章 中很好地总结了苹果公司的实现方式:“尽管起初 API 看起来有点粗糙,但一旦你学会了它们,你就可以在应用程序中做出惊人的事情。”事实证明,我们已经看到了很多惊人的事情,而且没有太多关于“粗糙”API 的抱怨。该模型后来被 Android、诺基亚、RIM、Opera 等公司实现。苹果公司的实现方式目前只在其 WebKit 的私有分支中可用;直到 2009 年底,触摸事件才首次出现在主 WebKit 仓库中,来自 Android 的实现方式。
同样是在 2009 年,W3C 开始讨论 DOM Level 3 事件的统一指针模型。其理念是将触摸(包括多点触摸)、笔/触控笔和鼠标事件合并到一个模型中,从而轻松支持所有指针类型。然而,这被放弃了,因为当时的目的是让规范尽可能小,以便更快地成为推荐标准。
两年后(2011 年 3 月),Mozilla 发布了 Firefox 4,其中包含 他们自己的触摸事件风格。Mozilla 模型更接近鼠标事件模型和被废弃的 W3C 模型,因为事件对象是扁平的;event.pageX
等属性存在,并且没有触摸列表。如果你想跟踪多个触摸,可以通过事件的 streamId
来实现。Mozilla 后来弃用了这种实现方式,转而采用基于苹果公司模型的新的 W3C 规范。
2011 年 1 月,W3C 开始起草 基于 WebKit 实现的触摸事件规范。几个月后,它成为了 工作草案,并在 12 月成为 候选推荐标准。次月,成立了一个 专利咨询小组 (PAG),以调查 苹果公司披露的专利。苹果公司没有参加触摸事件工作组 (WG),以及其专利披露,导致 W3C 停止了对规范的工作,并且他们计划在 PAG 结束之前,或者在 PAG 向 WG 提出建议之前,不会继续进行。截至本文撰写之时,PAG 尚未就这些专利的影響做出决定,但该小组的目标是迅速得出结论。
与此同时,微软对触摸采用了不同的方法,并在 IE10 中使用 指针事件 (带有 MSPointerEvent 对象) 来实现他们自己的方案。MSPointerEvent 对象类似于最初的 Mozilla 实现方式,因为事件对象是扁平的,并且包含 pointerId
属性。但是,MSPointer 与所有其他触摸特定模型之间存在一些重要区别。
注意:以上只是 Web 上触摸事件的简史;如果你有兴趣了解触摸界面的历史,你可能想看看 Bill Buxton 的 我所认识和喜爱的多点触摸系统。
指针事件与触摸事件
如上所述,通用指针事件(如最初的 W3C 想法或 MSPointer)具有支持多种指针设备的优势。事实上,在运行 Windows 8 的三星平板电脑上,鼠标、笔和手指都被规范化为 MSPointer;你甚至可以使用 pointerType
属性来确定正在使用的指针类型。除了支持所有当前的指针设备之外,MSPointer 的设计方式使将来可以轻松添加新设备,并且现有代码将自动支持新设备。更棒的是,MSPointer 事件对象与其他事件具有相同的结构,与触摸事件、触摸列表和触摸事件的集合相比,学习曲线更短。
MSPointer 和 Touch 之间的另一个重大区别是 MSPointer 支持悬停(悬停和移出事件)。虽然大多数触摸设备都有硬件限制,不允许悬停,但索尼最近宣布了 Xperia sola,它配备了“神奇的悬浮触摸技术”。这提出了一个重要问题:触摸事件是根据特定设备为特定类型的输入设计的。指针事件代表了 Web 上对输入的完全不同的方法。虽然我们已经介绍了这对开发人员的影响,但考虑这对硬件制造商的影响也很有趣。为了让苹果公司在触摸界面上取得成功,他们必须创建新的事件模型。针对新形状和新输入方法的创新要么会被现有标准扼杀,要么将需要一套新的 API,效仿苹果公司在 iPhone 和触摸事件上的做法。指针事件为开发人员和硬件制造商都提供了一个干净的解决方案。可以想象,几年后,开发人员可以使用指针事件作为指针的唯一事件模型,将鼠标事件抛之脑后。
支离破碎的未来
尽管 W3C 仍然计划继续推进触摸事件规范(取决于 PAG 的建议),但未来尚不明朗。即使 PAG 确定苹果公司的专利不适用,并且规范成为 W3C 推荐标准,也不清楚微软是否会在 Windows 中实现这种模型,因为需要一个多输入事件系统。如果 W3C 要改变方向,开始指针事件规范,也不清楚苹果公司,或者更广泛地说 WebKit,是否会实现新的事件模型。完全有可能,即使有 W3C 推荐标准,我们也将在几年内无法在浏览器和设备之间实现一致的事件模型。
无论 W3C 选择追求哪种模型,jQuery 都致力于填补空白,就像我们对其他事件(如提交和更改)所做的那样。我们认为指针事件模型更易于使用,并且更具前瞻性,我们希望它能够标准化,即使触摸事件也标准化了。但是,我们只对规范化为 W3C 推荐标准感兴趣,并且如果没有官方的 W3C 规范,我们不会提供自定义指针事件。我们正在与 W3C 和微软合作,努力找到对我们的用户和开放式 Web 最好的前进方向。
行动号召:微软提交指针事件提案
我们希望公开呼吁微软向 W3C 提交指针事件提案。触摸事件工作组,以及更广泛意义上的各种浏览器供应商,都表示对指针事件感兴趣。最有效的方法是让微软正式向 W3C 提交提案。
行动号召:社区尝试两种事件模型
我们还鼓励社区尝试 Touch 和 MSPointer。玩转 API,构建应用程序并提供反馈。如果你有兴趣,但没有必要的硬件,请考虑与一两个本地开发人员配对。虽然有很多开发人员在 Touch 之上构建,但只有很少的人在 MSPointer 之上构建,而公开比较它们的人就更少了。我们鼓励你将你的反馈直接发送到 W3C public-webevents 邮件列表,但请随时在此处留下反馈,我们将转达给你。
行动号召:提交现有技术
如果您知道任何关于多点触控/触控列表的现有技术,即使是在 Web 以外,也请联系 W3C。这包括编程模型和 API,特别是使用事件的那些。这将有助于专利咨询小组更快地得出结论。再说一遍,如果您想在这里留下评论,我们会将它们传递给相关人员。