html5触摸事件tap演化

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

触摸事件的类型:

为了区别触摸相关的状态改变,存在多种类型的触摸事件。可以通过检查触摸事件的 TouchEvent.type 属性来确定当前事件属于哪种类型。
注意: 在很多情况下,触摸事件和鼠标事件会同时被触发(目的是让没有对触摸设备优化的代码仍然可以在触摸设备上正常工作)。如果你使用了触摸事件,可以调用 event.preventDefault() 来阻止鼠标事件被触发。

事件名称 描述
touchstart 当用户在触摸平面上放置了一个触点时触发。事件的目标 element 将是触点位置上的那个目标 element
touchmove 当用户在触摸平面上移动触点时触发。事件的目标 element 和这个 touchmove 事件对应的 touchstart 事件的目标 element 相同,哪怕当 touchmove 事件触发时,触点已经移出了该 element 。
touchend 当一个触点被用户从触摸平面上移除(当用户将一个手指离开触摸平面)时触发。
当触点移出触摸平面的边界时也将触发。例如用户将手指划出屏幕边缘。
已经被从触摸平面上移除的触点,可以在 changedTouches 属性定义的 TouchList 中找到。
touchenter 当触点进入某个 element 时触发。此事件没有冒泡过程。
touchleave 当触点离开某个 element 时触发。此事件没有冒泡过程。
touchcancel 当触点由于某些原因被中断时触发。有几种可能的原因如下(具体的原因根据不同的设备和浏览器有所不同):

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

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

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

IE10+的触摸事件

事件名称 描述
MSPointerDown 触摸开始
MSPointerMove 接触点移动
MSPointerUp 触摸结束
MSPointerOver 触摸点移动到元素内,相当于mouseover
MSPointerOut 触摸点离开元素,相当于mouseout

等价事件

鼠标 触摸 键盘
mousedown touchstart keydown
mousemove touchmove keydown
mouseup touchend keyup
mouseover mouseover focus
MSPointerOut 触摸点离开元素,相当于mouseout

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

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

封装好的tap和longtap事件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

(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 {

scopeObj = 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)

ps: 原文链接

原文:大专栏  html5触摸事件tap演化

原文地址:https://www.cnblogs.com/chinatrump/p/11597071.html

时间: 2024-10-30 04:55:08

html5触摸事件tap演化的相关文章

关于windows phone 8.1系统手机对html5触摸事件的支持情况

近日购入一部微软Lumia 640手机,目的主要就是为了测试年中开发完成的响应式移动web项目,同时也为了将来升级win10 mobile系统.由于我们的项目目前只考虑支持IOS与Android系统,所以只支持了html5触摸事件(如touchstart). 印象中WP系统应该只支持MS开头(如MSPointerDown)的指针事件,但测试结果很出人意料:项目在WP8.1的Lumia 640手机上竟完全可以正常运行,并支持了所有的触摸事件... 对于这个问题我挺不解的,于是就查阅了下msdn文档

HTML5触摸事件演化tap事件

触摸事件是移动浏览器特有的HTML5事件,虽然click事件在pc和移动端更通用,但是在移动端会出现300ms延迟,较为影响用户体验,300ms延迟来自判断双击和长按,因为只有默认等待时间结束以确定没有后续动作发生时,才会触发click事件.所以触摸事件反应更快,体验更好. 触摸事件的类型: 为了区别触摸相关的状态改变,存在多种类型的触摸事件.可以通过检查触摸事件的 TouchEvent.type 属性来确定当前事件属于哪种类型. 注意: 在很多情况下,触摸事件和鼠标事件会同时被触发(目的是让没

HTML5触摸事件(touchstart、touchmove和touchend) (转)

HTML5中新添加了很多事件,但是由于他们的兼容问题不是很理想,应用实战性不是太强,所以在这里基本省略,咱们只分享应用广泛兼容不错的事件,日后随着兼容情况提升以后再陆续添加分享.今天为大家介绍的事件主要是触摸事件:touchstart.touchmove和touchend. 一开始触摸事件touchstart.touchmove和touchend是iOS版Safari浏览器为了向开发人员传达一些信息新添加的事件.因为iOs设备既没有鼠标也没有键盘,所以在为移动Safari浏览器开发交互性网页的时

HTML5触摸事件(touchstart、touchmove和touchend)

http://blog.csdn.net/kaikai4/article/details/46840317 http://blog.csdn.net/fuqinyijiu/article/details/41315123 //例子 $("body").on("touchstart", function(e) {     e.preventDefault();     startX = e.originalEvent.changedTouches[0].pageX,

通过html5 touch事件封装手势识别组件

html5移动端新增了touchstart,touchmove,touchend事件,利用这3个事件,判断手指的点击和划动轨迹,我们可以封装各种手势的识别功能, 这3个事件和pc端的mousedown,mousemove,mouveup非常类似,不同的是touch事件可以有多个点击的点,而鼠标每次只有一个点,我们即然是做组件封装,就要考虑在pc上调试的情况,否则用手机调试非常不方便,通过对mouse事件的处理,可以一套代码同时兼容pc端和移动端. 下面来逐步封装一个滑动手势(swipe)的组件

深入了解触摸事件的分发

1. 触摸动作及事件序列 (1)触摸事件的动作 触摸动作一共有三种:ACTION_DOWN.ACTION_MOVE.ACTION_UP.当用户手指接触屏幕时,便产生一个动作为ACTION_DOWN的触摸事件,此时若用户的手指立即离开屏幕,会产生一个动作为ACTION_UP的触摸事件:若用户手指接触屏幕后继续滑动,当滑动距离超过了系统中预定义的距离常数,则产生一个动作为ACTION_MOVE的触摸事件,系统中预定义的用来判断用户手指在屏幕上的滑动是否是一个ACTION_MOVE动作的这个距离常量叫

Android View 触摸事件传递机制

PS:以现在的眼光看以前写的博客感觉写的很烂,或许或一段时间再看现在的博客会有同样的感觉.所以每时每刻都去学习,去发现和理解新的东西. 引言 由于之前写的一篇关于Android事件传递顺序的博客质量太差,可能是理解不到位的原因,故最近又花了许多时间再次去看Android源码,看完之后有了新的理解,所以打算重新整理这篇博客.理解Android触摸事件传递机制有助于日后的开发以及自定义一些手势效果等.注意:这篇博客是基于Android2.0源码来分析的,不管老版本还是新版本的Android,其内部触

iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

-- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事件(手势操作).运动事件.远程控制事件等展开学习: iOS事件简介 触摸事件 手势识别 运动事件 远程控制事件 iOS事件 在iOS中事件分为三类: 触摸事件:通过触摸.手势进行触发(例如手指点击.缩放) 运动事件:通过加速器进行触发(例如手机晃动) 远程控制事件:通过其他远程设备触发(例如耳机控制

iOS开发笔记--iOS中的触摸事件和手势处理

iOS中的事件可以分为三大类:原文:http://my.oschina.net/aofe/blog/268749 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为"响应者对象". UIApplication,UIViewController,UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件. UIRespon