随着越来越多的公司进军移动领域,触摸事件已经成为 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 结束或向 WG 提出建议之前不会继续。截至撰写本文时,PAG 尚未就专利的影響做出决定,但该小组的目标是尽快得出结论。
与此同时,微软采取了一种不同的方法来处理触摸,并在 IE10 中使用指针事件实现了他们自己的MSPointerEvent 对象。MSPointerEvent 对象类似于原始的 Mozilla 实现,因为事件对象是扁平的,并包含一个 pointerId
属性。然而,MSPointer 与所有其他模型(触摸特定模型)之间存在一些重要的差异。
注意:以上只是 Web 上触摸事件的简史;如果您对触摸界面的历史感兴趣,您可能想查看 Bill Buxton 的我所知和喜爱的多点触摸系统。
指针事件与触摸事件
如上所述,通用指针事件,例如原始的 W3C 想法或 MSPointer,具有支持多个指针设备的优势。事实上,在运行 Windows 8 的三星平板电脑上,鼠标、触控笔和手指都归一化为 MSPointer;您甚至可以使用 pointerType
属性来确定使用的是哪种类型的指针。除了支持所有当前的指针设备外,MSPointer 的设计方式使得未来的设备可以轻松添加,并且现有代码将自动支持新设备。更棒的是,MSPointer 事件对象与其他事件具有相同的结构,与 TouchEvent、TouchList 和 Touch 的组合相比,学习曲线更短。
MSPointer 和 Touch 之间的另一个重大区别是,MSPointer 支持悬停(悬停和悬停事件)。虽然大多数触摸设备具有硬件限制,不允许悬停,但索尼最近宣布了 Xperia sola,它具有“神奇的浮动触摸技术”。这带来了一个重要的问题:触摸事件是基于特定设备的特定输入类型而设计的。指针事件代表了 Web 上输入的完全不同方法。虽然我们已经介绍了这对开发人员的影响,但考虑对硬件制造商的影响很有趣。为了让苹果在触摸界面上取得成功,他们必须创建一种新的事件模型。针对新型式和新输入方法的创新要么会被现有标准扼杀,要么需要一套新的 API,效仿苹果在 iPhone 和触摸事件中采取的步骤。指针事件为开发人员和硬件制造商都提供了一个干净的解决方案。可以想象,在几年内,开发人员可以将指针事件用作指针的唯一事件模型,将鼠标事件留作历史。
分裂的未来
虽然 W3C 仍在计划继续推进触摸事件规范(待 PAG 建议通过),但未来尚不明朗。即使 PAG 确定苹果的专利不适用,并且规范成为 W3C 建议,也不清楚微软是否会实施这种模型,因为 Windows 需要多输入事件系统。如果 W3C 改变方向并开始制定指针事件规范,也不清楚苹果,或者更广泛地说 WebKit,是否会实施新的事件模型。即使有 W3C 建议,我们也有可能多年来都无法在浏览器和设备之间获得一致的事件模型。
无论 W3C 选择追求哪种模型,jQuery 都致力于填补空白,就像我们对其他事件(如提交和更改)所做的那样。我们认为指针事件模型更易于使用,并且更具前瞻性,我们希望它能够实现标准化,即使触摸事件也实现了标准化。但是,我们只对标准化为 W3C 建议感兴趣,并且如果没有任何官方的 W3C 规范,我们将不会提供自定义指针事件。我们正在与 W3C 和微软合作,尝试为我们的用户和开放 Web 找到最佳前进方向。
行动号召:微软提交指针事件提案
我们希望公开呼吁微软向 W3C 提交指针事件提案。触摸事件工作组以及更广泛地说,各个浏览器供应商都表示对指针事件感兴趣。最有效的方法是让微软正式向 W3C 提交提案。
行动号召:社区尝试两种事件模型
我们还鼓励社区尝试触摸和 MSPointer。试用 API、构建应用程序并提供反馈。如果您有兴趣,但没有必要的硬件,请考虑与一位或多位当地开发人员合作。虽然有很多开发人员在触摸之上进行构建,但很少有人在 MSPointer 之上进行构建,而公开比较它们的人就更少了。我们鼓励您将您的反馈直接发送到 W3C public-webevents 邮件列表,但您可以随时在此处留下反馈,我们会转达给相关人员。
行动号召:提交现有技术
如果您知道任何关于多点触控/触摸列表的现有技术,即使是在 Web 之外,也请 联系 W3C。这包括编程模型和 API,尤其是使用事件的那些。这将有助于专利咨询小组尽快得出结论。同样,如果您愿意在此处留下评论,我们会转达给相关人员。