触控事件已成为 Web 开发人员的热门话题,因为越来越多的公司进入移动领域。我们大多数人都知道触控事件支持单点和多点触控跟踪。有些人知道同时处理触控和鼠标的棘手之处。较少的人知道有多种触控事件模型,更少的人尝试同时支持多种模型。我想谈谈我们今天的状况、我们如何到达这里以及我们未来可能面临的问题。
简要历史
早在 2007 年,苹果公司推出了 iPhone,并带来了触控事件。Neil Roberts 在 SitePen 文章中很好地总结了苹果的实现: “虽然一开始 API 看起来有点粗糙,但一旦你学会了它们,你就能在你的应用程序中做令人惊叹的事情。” 事实证明,我们已经看到了很多令人惊叹的事情,而对“粗糙”API 的抱怨不多。这种模型后来被 Android、Nokia、RIM、Opera 等公司实施。苹果的实现仍然只在其私有 WebKit 分支中可用;直到 2009 年底,触控事件才首次出现在主要的 WebKit 仓库中,来自 Android 实现。
同样在 2009 年,W3C 开始讨论 DOM Level 3 Events 的统一指针模型。这个想法是触控(包括多点触控)、笔/手写笔和鼠标事件将被合并到一个模型中,从而易于支持所有指针类型。但是,由于当时的目标是尽可能地缩小规范范围,以便更快地成为推荐标准,因此该方案被放弃了。
又过了两年(2011 年 3 月),Mozilla 发布了 Firefox 4,其中包含他们自己的触控事件风格。Mozilla 模型更接近鼠标事件模型和放弃的 W3C 模型,即事件对象是扁平的;存在诸如 event.pageX 之类的属性,并且没有触控列表。如果您想跟踪多个触控,可以通过事件的 streamId 来实现。Mozilla 后来弃用了这种实现,转而支持新兴的基于苹果模型的 W3C 规范。
在2011年1月,W3C开始起草一个基于WebKit实现的 触摸事件规范。几个月后,它成为一个 工作草案,并在12月成为一个 候选推荐。下个月,成立了一个 专利咨询组 (PAG),以调查 苹果公司披露的专利。苹果公司缺席触摸事件工作组 (WG) 及其专利披露导致W3C 停止该规范的工作,并且他们不计划在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 提交指针事件的提案。触控事件工作组,以及由此延伸的各种浏览器厂商,都已表示对指针事件感兴趣。最有效的方式是微软正式向 W3C 提交提案。
行动号召:社区实验两种事件模型
我们还鼓励社区尝试触控和 MSPointer。使用这些 API,构建应用程序,并提供反馈。如果您对此感兴趣,但没有必要的硬件,可以考虑与一位或多位拥有相关硬件的本地开发者合作。虽然有很多开发者正在构建基于触控的应用,但构建基于 MSPointer 的人却很少,公开比较它们的人就更少了。我们鼓励您将反馈直接发送到 W3C public-webevents 邮件列表,但也可以在此处留下反馈,我们会转达给他们。
行动号召:提交现有技术
如果您了解任何关于多点触控/触控列表的现有技术,即使不在 Web 范围内,请 联系 W3C。这包括编程模型和 API,特别是使用事件的那些。这将有助于专利咨询组更快地得出结论。同样,如果您更愿意在此处留下评论,我们会转达给他们。