我的编程空间,编程开发者的网络收藏夹
学习永远不晚

HTML5触摸事件演化tap事件的示例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

HTML5触摸事件演化tap事件的示例分析

HTML5触摸事件演化tap事件介绍,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

触摸事件是移动浏览器特有的HTML5事件,虽然click事件在pc和移动端更通用,但是在移动端会出现300ms延迟,较为影响用户体验,300ms延迟来自判断双击和长按,因为只有默认等待时间结束以确定没有后续动作发生时,才会触发click事件。所以触摸事件反应更快,体验更好。

HTML5触摸事件演化tap事件的示例分析

触摸事件的类型:

为了区别触摸相关的状态改变,存在多种类型的触摸事件。可以通过检查触摸事件的 TouchEvent.type 属性来确定当前事件属于哪种类型。

注意: 在很多情况下,触摸事件和鼠标事件会同时被触发(目的是让没有对触摸设备优化的代码仍然可以在触摸设备上正常工作)。如果你使用了触摸事件,可以调用 event.preventDefault() 来阻止鼠标事件被触发。

标准的触摸事件

事件名称描述包含touches数组

touchstart

当用户在触摸平面上放置了一个触点时触发。事件的目标 element 将是触点位置上的那个目标 element

touchmove

当用户在触摸平面上移动触点时触发。

事件的目标 element 和这个 touchmove 事件对应的 touchstart 事件的目标 element 相同,

哪怕当 touchmove 事件触发时,触点已经移出了该 element 。

touchend

当一个触点被用户从触摸平面上移除(当用户将一个手指离开触摸平面)时触发。

当触点移出触摸平面的边界时也将触发。例如用户将手指划出屏幕边缘。

已经被从触摸平面上移除的触点,可以在 changedTouches 属性定义的 TouchList 中找到。

touchenter

当触点进入某个 element 时触发。此事件没有冒泡过程。

touchleave

当触点离开某个 element 时触发。此事件没有冒泡过程。

touchcancel

当触点由于某些原因被中断时触发。有几种可能的原因如下(具体的原因根据不同的设备和浏览器有所不同):

  • 由于某个事件取消了触摸:例如触摸过程被一个模态的弹出框打断。

  • 触点离开了文档窗口,而进入了浏览器的界面元素、插件或者其他外部内容区域。

  • 当用户产生的触点个数超过了设备支持的个数,从而导致 TouchList 中最早的 Touch 对象被取消。

触摸对象属性

Touch.identifier返回一个可以唯一地识别和触摸平面接触的点的值. 这个值在这根手指(或触摸笔等)所引发的所有事件中保持一致, 直到它离开触摸平面.
Touch.screenX触点相对于屏幕左边沿的的X坐标. 只读属性.
Touch.screenY触点相对于屏幕上边沿的的Y坐标. 只读属性.
Touch.clientX触点相对于可见视区左边沿的的X坐标. 不包括任何滚动偏移. 只读属性.
Touch.clientY触点相对于可见视区上边沿的的Y坐标. 不包括任何滚动偏移. 只读属性.
Touch.pageX触点相对于HTML文档左边沿的的X坐标. 当存在水平滚动的偏移时, 这个值包含了水平滚动的偏移只读属性.
Touch.pageY触点相对于HTML文档上边沿的的Y坐标. 当存在水平滚动的偏移时, 这个值包含了垂直滚动的偏移只读属性.
Touch.radiusX能够包围用户和触摸平面的接触面的最小椭圆的水平轴(X轴)半径. 这个值的单位和 screenX 相同. 只读属性.
Touch.force手指挤压触摸平面的压力大小, 从0.0(没有压力)到1.0(最大压力)的浮点数. 只读属性.
Touch.radiusY能够包围用户和触摸平面的接触面的最小椭圆的垂直轴(Y轴)半径. 这个值的单位和 screenY 相同. 只读属性.
Touch.target

当这个触点最开始被跟踪时(在 touchstart 事件中), 触点位于的HTML元素. 哪怕在触点移动过程中, 触点的位置已经离开了这个元素的有效交互区域,

或者这个元素已经被从文档中移除. 需要注意的是, 如果这个元素在触摸过程中被移除, 这个事件仍然会指向它, 但是不会再冒泡这个事件到 window 或 document 对象.

因此, 如果有元素在触摸过程中可能被移除, 最佳实践是将触摸事件的监听器绑定到这个元素本身, 防止元素被移除后, 无法再从它的上一级元素上侦测到从该元素冒泡的事件. 只读属性.

IE10+的触摸事件

IE指针事件
事件名称描述(在触摸设备上)
MSPointerDown触摸开始
MSPointerMove接触点移动
MSPointerUp触摸结束
MSPointerOver触摸点移动到元素内,相当于mouseover
MSPointerOut触摸点离开元素,相当于mouseout

MSPointerEvent属性

属性描述
hwTimestamp创建事件的时间(ms)
isPrimary标识该指针是不是主指针
pointerId指针的唯一ID(类似于触摸事件的标识符)
pointerType一个整数,标识了该事件来自鼠标、手写笔还是手指
pressure笔的压力,0-255,只有手写笔输入时才可用
rotation0-359的整数,光标的旋转度(如果支持的话)
tiltX/tiltY手写笔的倾斜度,只有用手写笔输入时才支持

等价事件

鼠标触摸键盘
mousedowntouchstartkeydown
mousemovetouchmovekeydown
mouseuptouchendkeyup
mouseover focus

很显然,触摸动作序列:touchstart-touchmove-touchend和鼠标序 列:mousedown-mousemove-mouseup以及键盘序列:keydown-keypress-keyup很相似,这并不是巧合,因为这 三种交互模式都可以描述为start-move-stop。

话说回来,click要经过touchstart-touchmove-touchend流程,300ms延迟,所以需要tap事件,tap就是在同一个点轻触时间很短。

封装好的tap和longtap事件

XML/HTML Code复制内容到剪贴板

  1. (function() {    
        var TOUCHSTART, TOUCHEND;    
        if (typeof(window.ontouchstart) != 'undefined') {    
            TOUCHSTART = 'touchstart';    
            TOUCHEND = 'touchend';    
            TOUCHMOVE='touchmove';    
         
        } else if (typeof(window.onmspointerdown) != 'undefined') {    
            TOUCHSTART = 'MSPointerDown';    
            TOUCHEND = 'MSPointerUp';    
            TOUCHMOVE='MSPointerMove';    
        } else {    
            TOUCHSTART = 'mousedown';    
            TOUCHEND = 'mouseup';    
            TOUCHMOVE = 'mousemove';    
        }    
        function NodeTouch(node) {    
            this._node = node;    
        }    
        function tap(node,callback,scope) {    
            node.addEventListener(TOUCHSTART, function(e) {    
                x = e.touches[0].pageX;    
                y = e.touches[0].pageY;    
            });    
            node.addEventListener(TOUCHEND, function(e) {    
                e.stopPropagation();    
                e.preventDefault();    
                var curx = e.changedTouches[0].pageX;    
                var cury = e.changedTouches[0].pageY;    
                if (Math.abs(curx - x) < 6 && Math.abs(cury - y) < 6) {    
                    callback.apply(scope, arguments);    
                }    
            });    
        }    
        function longTap(node,callback,scope) {    
            var x,y,startTime=0,endTime=0,in_dis=false;    
            node.addEventListener(TOUCHSTART, function(e) {    
                x = e.touches[0].pageX;    
                y = e.touches[0].pageY;    
                startTime=(new Date()).getTime();    
            });    
            node.addEventListener(TOUCHEND, function(e) {    
                e.stopPropagation();    
                e.preventDefault();    
                var curx = e.changedTouches[0].pageX;    
                var cury = e.changedTouches[0].pageY;    
                if (Math.abs(curx - x) < 6 && Math.abs(cury - y) < 6) {    
                    in_dis=true;    
                }else{    
                    in_dis=false;    
                }    
                endTime=(new Date()).getTime();    
                if (endTime - startTime > 300 && in_dis) {    
                    callback.apply(scope, arguments);    
                }    
            });    
        }    
        NodeTouch.prototype.on = function(evt, callback, scope) {    
            var scopeObj;    
            var x,y;    
            if (!scope) {    
                scopeObj = this._node;    
            } else {    
                scopescopeObj = scope;    
            }    
            if (evt === 'tap') {    
                tap(this._node,callback,scope);    
            } else if(evt === 'longtap'){    
                longTap(this._node,callback,scope);    
            } else {    
                this._node.addEventListener(evt, function() {    
                    callback.apply(scope, arguments);    
                });    
            }    
            return this;    
        }    
        window.$ = function(selector) {    
            var node = document.querySelector(selector);    
            if (node) {    
                return new NodeTouch(node);    
            } else {    
                return null;    
            }    
        }    
    })();    
    var box=$("#box");    
    box.on("longtap",function(){    
        console.log("你已经长按了");    
    },box)

看完上述内容,你们掌握HTML5触摸事件演化tap事件介绍的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

HTML5触摸事件演化tap事件的示例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

HTML5触摸事件的实现示例

这篇文章主要介绍HTML5触摸事件的实现示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容
2023-06-09

Android 的触摸事件详解及示例代码

由于触摸(Touch)而触发的事件 Android的事件:onClick, onScroll,onFling等等,都是由许多个Touch组成的。其中Touch的第一个状态肯定是ACTION_DOWN,表示按下了屏幕。之后,touch将会有后
2022-06-06

html5 datalist选中option选项后触发事件的示例分析

这篇文章将为大家详细讲解有关html5 datalist选中option选项后触发事件的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用input + datalist 实现自动补全功能,其中d
2023-06-09

如何实现Android触摸事件分发的原理分析

如何实现Android触摸事件分发的原理分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一:前言最近在学Android的触摸事件分发,我觉得网上说的太杂太乱,而且有很多博客都
2023-06-26

js事件流、事件委托与事件阶段的示例分析

这篇文章主要介绍了js事件流、事件委托与事件阶段的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、事件流HTML 中与 javascript 交互是通过事件驱动来实
2023-06-29

nodejs中事件和事件循环的示例分析

这篇文章主要介绍nodejs中事件和事件循环的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!nodejs中的事件循环虽然nodejs是单线程的,但是nodejs可以将操作委托给系统内核,系统内核在后台处理这些
2023-06-14

JavaScript事件流的示例分析

这篇文章主要介绍JavaScript事件流的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1.什么是事件流 ?在学习事件流之前我们先看看什么是事件 ?事件代表文档或浏览器窗口中某个有意义的时刻即用户与页面的交
2023-06-29

编程热搜

目录