首页 > web前端 > H5教程 > 正文

HTML5触摸事件演化tap事件介绍_html5教程技巧

WBOY
发布: 2016-05-16 15:45:25
原创
2080 人浏览过

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

触摸事件的类型:

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

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

标准的触摸事件

事件名称 描述 包含touches数组

touchstart

当用户在触摸平面上放置了一个触点时触发。事件的目标 <font face="NSimsun">element</font> 将是触点位置上的那个目标 <font face="NSimsun">element</font>

touchmove

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

事件的目标 <font face="NSimsun">element</font> 和这个<font face="NSimsun"> touchmove </font>事件对应的 <font face="NSimsun">touchstart 事件的目标</font> <font face="NSimsun">element</font> 相同,

哪怕当 <font face="NSimsun">touchmove</font> 事件触发时,触点已经移出了该 <font face="NSimsun">element</font> 。

touchend

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

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

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

touchenter

当触点进入某个 <font face="NSimsun">element</font> 时触发。此事件没有冒泡过程。

touchleave

当触点离开某个 <font face="NSimsun">element</font> 时触发。此事件没有冒泡过程。

touchcancel

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

  • 由于某个事件取消了触摸:例如触摸过程被一个模态的弹出框打断。
  • 触点离开了文档窗口,而进入了浏览器的界面元素、插件或者其他外部内容区域。
  • 当用户产生的触点个数超过了设备支持的个数,从而导致 <font face="NSimsun">TouchList</font> 中最早的 <font face="NSimsun">Touch</font> 对象被取消。

触摸对象属性

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

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

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

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

 

IE10+的触摸事件

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

 

MSPointerEvent属性

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

 

等价事件

鼠标 触摸 键盘
mousedown touchstart keydown
mousemove touchmove keydown
mouseup touchend keyup
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() {    
  2.     var TOUCHSTART, TOUCHEND;    
  3.     if (typeof(window.ontouchstart) != 'undefined') {    
  4.         TOUCHSTART = 'touchstart';    
  5.         TOUCHEND = 'touchend';    
  6.         TOUCHMOVE='touchmove';    
  7.      
  8.     } else if (typeof(window.onmspointerdown) != 'undefined') {    
  9.         TOUCHSTART = 'MSPointerDown';    
  10.         TOUCHEND = 'MSPointerUp';    
  11.         TOUCHMOVE='MSPointerMove';    
  12.     } else {    
  13.         TOUCHSTART = 'mousedown';    
  14.         TOUCHEND = 'mouseup';    
  15.         TOUCHMOVE = 'mousemove';    
  16.     }    
  17.     function NodeTouch(node) {    
  18.         this._node = node;    
  19.     }    
  20.     function tap(node,callback,scope) {    
  21.         node.addEventListener(TOUCHSTART, function(e) {    
  22.             x = e.touches[0].pageX;    
  23.             y = e.touches[0].pageY;    
  24.         });    
  25.         node.addEventListener(TOUCHEND, function(e) {    
  26.             e.stopPropagation();    
  27.             e.preventDefault();    
  28.             var curx = e.changedTouches[0].pageX;    
  29.             var cury = e.changedTouches[0].pageY;    
  30.             if (Math.abs(curx - x)  6 && Math.abs(cury - y)  6) {    
  31.                 callback.apply(scope, arguments);    
  32.             }    
  33.         });    
  34.     }    
  35.     function longTap(node,callback,scope) {    
  36.         var x,y,startTime=0,endTime=0,in_dis=false;    
  37.         node.addEventListener(TOUCHSTART, function(e) {    
  38.             x = e.touches[0].pageX;    
  39.             y = e.touches[0].pageY;    
  40.             startTime=(new Date()).getTime();    
  41.         });    
  42.         node.addEventListener(TOUCHEND, function(e) {    
  43.             e.stopPropagation();    
  44.             e.preventDefault();    
  45.             var curx = e.changedTouches[0].pageX;    
  46.             var cury = e.changedTouches[0].pageY;    
  47.             if (Math.abs(curx - x)  6 && Math.abs(cury - y)  6) {    
  48.                 in_dis=true;    
  49.             }else{    
  50.                 in_dis=false;    
  51.             }    
  52.             endTime=(new Date()).getTime();    
  53.             if (endTime - startTime > 300 && in_dis) {    
  54.                 callback.apply(scope, arguments);    
  55.             }    
  56.         });    
  57.     }    
  58.     NodeTouch.prototype.on = function(evt, callback, scope) {    
  59.         var scopeObj;    
  60.         var x,y;    
  61.         if (!scope) {    
  62.             scopeObj = this._node;    
  63.         } else {    
  64.             scopescopeObj = scope;    
  65.         }    
  66.         if (evt === 'tap') {    
  67.             tap(this._node,callback,scope);    
  68.         } else if(evt === 'longtap'){    
  69.             longTap(this._node,callback,scope);    
  70.         } else {    
  71.             this._node.addEventListener(evt, function() {    
  72.                 callback.apply(scope, arguments);    
  73.             });    
  74.         }    
  75.         return this;    
  76.     }    
  77.     window.$ = function(selector) {    
  78.         var node = document.querySelector(selector);    
  79.         if (node) {    
  80.             return new NodeTouch(node);    
  81.         } else {    
  82.             return null;    
  83.         }    
  84.     }    
  85. })();    
  86. var box=$("#box");    
  87. box.on("longtap",function(){    
  88.     console.log("你已经长按了");    
  89. },box)  

以上这篇HTML5触摸事件演化tap事件介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

原文地址:http://www.cnblogs.com/hutuzhu/archive/2016/03/25/5315638.html

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板