关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » UI前端 »浏览器输入事件:我们可以做的比点击更好么?

    浏览器输入事件:我们可以做的比点击更好么?

    2015-05-24 00:00:00 出处:oschina
    分享

    响应用户输入可以说是我们界面开发的核心。为了构建响应式Web产品,理解触摸,鼠标,指针,键盘如何和浏览器一起工作是关键。你很有可能已经在移动浏览器上经历了300毫秒的延迟或者在纠结于触摸滚动导致页面卡顿。

    在该文中,我们将介绍事件级联并且利用这些知识来实现一个支持多种输入法的点击事件而不违反像Opera Mini这些代理浏览器事件规则。

    概括

    在当今网络交互中有三个主要方法,数字光标(鼠标),触觉(直接触摸或笔)和键盘。在JavaScript中我们必须通过触摸事件,鼠标事件,指针事件和键盘事件获得这些。在该文中,我们主要关注的是以触摸和鼠标为基础的交互,虽然有些事件有标准的键盘基础互动。例如click和submit事件。

    你应该已经准备好了关于mouse和touch事件的事件句柄。在过去不久的时候,我们有一个类似于这样的推荐方法:

    /** DO NOT EVER DO THIS! */
    $('a', ('ontouchstart' in window)   'touchend' : 'click', handler);

    微软已经首先致力于创造更好的,更有未来的“指针事件”规范。指针事件是现在在W3C拟议的一个抽象的输入机制。鼠标指针事件给用户代理很大的灵活性,它在少于一个事件的系统下可以容纳大量的输入机制。鼠标,触摸和手写笔是如今很容易浮现在脑海里的例子,尽管延伸至Myo和Ring也是有可能实现的。而Web开发人员似乎很兴奋这一点,尽管并不是所有的浏览器的工程师们也有同感。就像苹果和谷歌已经决定不在这个时候落实指针事件。

    谷歌的决定并不一定是最终的,但现在对指针事件并没有积极的工作。我们通过polyfills输入和使用指针事件和替代解决方案将成为等式的一部分,可能最终起决定作用。苹果在2012年对指针事件做出了发言,不过我没有看到Safari的工程师有其他更进一步的公开回应

    事件级联

    当用户在移动装置上点击元素时,浏览器将激活事件。这个动作通常会触发一系列如下事件:touchstart → touchend →mouseover → mousemove → mousedown → mouseup → click。

    这是由于web的向后兼容性。指针事件采取另一种方式,触发内联兼容事件:mousemove → pointerover → mouseover→ pointerdown → mousedown → gotpointercapture → pointerup → mouseup → lostpointercapture→ pointerout → mouseout → focus → click。

    事件规范允许用户代理们用不同的方式来实现兼容性的事件。Patrick Lauke和Peter-Paul Koch在这个话题上有着观法的参考资料,在该文底部有链接到这些资源的链接。

    下图显示了事件级联的操作流程:

    在一个元素上最初的点击, 在一个元素上第二次点击, 关闭元素点击

    请注意:此事件堆栈中有意的忽略了聚焦和失焦事件

    事件级联IOS

    事件级联在IOS设备上点击元素两次然后失去事件(图片:Stephen Davis)(查看大图)

    事件级联Android

    事件级联在Android4.4以上设备上点击元素两次然后失去事件(图片:Stephen Davis)(查看大图)

    事件级联IE

    事件级联在IE11(兼容触摸事件实施之前)上点击元素两次然后失去事件(图片:Stephen Davis)(查看大图)

    运用事件级联

    因为浏览器工程师的工作,如今创建的大多数桌面Web网站“只是可以运行”。尽管级联看起来有点粗糙,但建立鼠标事件是我们以前通常工作的保守做法。

    当然,这有一个陷阱。臭名昭著的300毫秒延迟是非常有名的,但是滚动之间的相互作用,touchmove和pointermove事件,浏览器的渲染这些额外的问题。避免300毫秒的延迟是很容易的,假如:

    我们只优化Android和桌面上的使用启发式现代浏览器,比如通过<meta name="viewport" content="width=device-width">来禁用延迟。 我们只优化适用于IOS,而且用户也明确按下而不是一个快速点击或者长按——这知识一个良好的、正常的、明确的元素(哦,那也取决于它是否是在一个UIWebView或者一个WKWebView上面-可以看一下FastClick的话题)。

    假如我们的目标是建立一个在用户体验上可以和本地平台竞争Web产品,那么我们就需要减少交互所带来的延迟。要做到这一点,我们必须建立原始事件(down,move和up),并创建自己的复合事件(click, double-click)。当然,我么仍然需要包括本机备用处理程序来得到广泛支持和辅助。

    这样做需要大量的代码和知识。为了避免300毫秒(或任何长度)跨浏览器延迟,我么需要自己处理生命周期的全部交互。对于给定的{type}down事件,我么需要绑定所有事件,为完成该操作这是必要的。当交互完成后,我们会在需要自己清理除了其实事件的所有被接触绑定的事件。

    网站开发人员,你是唯一一个知道页面是否应该放大或另一个双击事件是否必须等待的人。假如只有你需要回调推迟你应该允许一个预定的动作来延迟。

    在下面的链接里,你会发现一个小的,无依赖点击案例来说明建立一个多输入、低延迟的点击事件所需的工作量。Polymer-gestures是一个为tap点击和其他事件生产开发的库。尽管是这个名字有Polymer,但是它是不依赖Polymer库而且很容易被隔离。

    明确的说,实施这个从一开始来说就是一个坏主意,以下这些应该仅仅用于教育而不是用于生产环境。用于生产环境的库已经存在,例如:FastClick, polymer-gestures和Hammer.js。

    案例:The tap event 源码:taps.js

    重要部分

    在所有开始的地方绑定你的初始事件,这下面处理多输入的模式是被认为一种保险的方式。

    /**
     + If there are pointer events, let the platform handle the input
     + mechanism abstraction. If not, then it’s on you to handle
     + between mouse and touch events.
     */
    if (hasPointer) {
      tappable.addEventListener(POINTER_DOWN, tapStart, false);
      clickable.addEventListener(POINTER_DOWN, clickStart, false);
    }
    else {
      tappable.addEventListener('mousedown', tapStart, false);
      clickable.addEventListener('mousedown', clickStart, false);
      if (hasTouch) {
        tappable.addEventListener('touchstart', tapStart, false);
        clickable.addEventListener('touchstart', clickStart, false);
      }
    }
    clickable.addEventListener('click', clickEnd, false);

    绑定touch事件需要和渲染性能妥协,即使它们没有做任何事,但为了减少这种影响,通常推荐在处理程序开始时候绑定跟踪事件。别忘了在完成你的事件处理后要清理自己的环境和解绑跟踪事件。

    /**
     + On tapStart we want to bind our move and end events to detect
     + whether this is a “tap” action.
     + @param {Event} event the browser event object
     */
    function tapStart(event) {
      // bind tracking events. “bindEventsFor” is a helper that automatically
      // binds the appropriate pointer, touch or mouse events based on our
      // current event type. Additionally, it saves the event target to give
      // us similar behavior to pointer events’ “setPointerCapture” method.
      bindEventsFor(event.type, event.target);
      if (typeof event.setPointerCapture === 'function') {
        event.currentTarget.setPointerCapture(event.pointerId);
      }
      // prevent the cascade
      event.preventDefault();
      // start our profiler to track time between events
      set(event, 'tapStart', Date.now());
    }
    /**
     + tapEnd. Our work here is done. Let’s clean up our tracking events.
     + @param {Element} target the html element
     + @param {Event} event the browser event object
     */
    function tapEnd(target, event) {
      unbindEventsFor(event.type, target);
      var _id = idFor(event);
      log('Tap', diff(get(_id, 'tapStart'), Date.now()));
      setTimeout(function() {
        delete events[_id];
      });
    }

    剩下的这些代码应该能够很好的自我解释,事实上,它有很多簿记,实现自定义手势要求你用浏览器事件系统来紧密合作。为了挽救你的受伤和心痛,不要在你自己的代码库里做事情。相反你应该建立或使用一个强大的抽象,例如Hammer.js,jQuery polyfill的Pointer Events或者polymer-gestures。

    总结

    一些曾经很清楚的事件现在却是有歧义的,以前click事件用来指有且只有一件事,但是现在在触摸屏上面需要辨别是双击、滚动或者其他操作系统的手势。

    好消息是,我们现在明白了很多用户的操作习惯和浏览器的响应之间的事件级联和相互作用,通过在工作中认识的原语,我们自己能够在我们的项目中为我们的用户和Web的未来做出更好的决策。

    你在构建多设备的网站时,有遇到什么意想不到的问题?你采取什么样的方法来解决Web上众多的交互模式?

    扩展阅读

    “Pointer Events Finalized, But Apple’s Lack of Support Still a Deal Breaker” Peter Bright “Getting Touchy: An Introduction to Touch and Pointer Events,” including slides and talk, Patrick E. Lauke “Apple’s Web ” by Tim Kadlec “Avoiding the 300ms Click Delay, Accessibly” Tim Kadlec “Touch Table” Peter-Paul Koch “Making the Web ‘Just Work’ With Any Input: Mouse, Touch, and Pointer Events” Jacob Rossi FastClick library Hammer.js polymer-gestures PointerEvents jQuery polyfill “Implement Custom Gestures” Google Developers
    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    Destoon 模板存放规则及语法参考

    Destoon系统常量与变量

    Destoon系统目录文件结构说明

    Destoon 系统安装指南

    Destoon会员公司主页模板风格添加方法

    Destoon 二次开发入门

    Microsoft 将于 2026 年 10 月终止对 Windows 11 SE 的支持

    Windows 11 存储感知如何设置?了解Windows 11 存储感知开启的好处

    Windows 11 24H2 更新灾难:系统升级了,SSD固态盘不见了...

    小米路由器买哪款?Miwifi热门路由器型号对比分析

    IT头条

    Synology 对 Office 套件进行重大 AI 更新,增强私有云的生产力和安全性

    01:43

    StorONE 的高效平台将 Storage Guardian 数据中心占用空间减少 80%

    11:03

    年赚千亿的印度能源巨头Nayara 云服务瘫痪,被微软卡了一下脖子

    12:54

    国产6nm GPU新突破!砺算科技官宣:自研TrueGPU架构7月26日发布

    01:57

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    技术热点

    如何删除自带的不常用应用为windows 7减负

    MySQL中多表删除方法

    改进的二值图像像素标记算法及程序实现

    windows 7 32位系统下手动修改磁盘属性例如M盘修改为F盘

    windows 7中怎么样在家庭组互传文件

    Linux应用集成MySQL数据库访问技巧

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。