移动端事件

  • 为什么移动端不用click
    移动端的click有300ms延迟的问题,在移动端浏览器中,连续两次点击是缩放操作,所以在用户点击屏幕后,浏览器会检查在300ms内是否有另一次点击,如果没有则触发click事件,所以移动端不用click
  • 替换click的方案
    1.使用touchstart
    touch事件包括touchstart、touchend、touchmove等,简单使用touchstart来替换click,但问题是,如果我想在同一对象上绑定一个单击事件和一个滑动事件怎么办,这时候就会出现冲突。
    2.使用tap事件
    标准事件中没有tap事件,tap事件是一些库,如zepto,使用touch进行封装的,在touchstart、touchend时记录时间、手指位置,在touchend时进行比较,如果手指位置为同一位置且时间间隔较短,且过程中未曾触发touchmove事件,则调用回调函数。
    zepto用于判断的关键代码:
//延迟时间
 if (delta > 0 && delta <= 250) touch.isDoubleTap = true;
//允许的偏移量
if (deltaX < 30 && deltaY < 30) {……}

不过300ms后还是会产生click事件,只是在该对象上没有进行监听,由此产生了“点透”现象:
(1)页面弹出一个模态框,模态框上有个按钮(关闭模态框),按钮正下方(在主页面上)有一个输入框
(2)当点击模态框上的关闭按钮,模态框立即消失,但300ms后click事件触发,而输入框正好监听click事件,因此输入框会得到焦点
为什么不对click进行拦截呢?原因是zepto使用的是事件代理,元素上的touch事件冒泡到document上,在document的事件回调中执行绑定在元素上的事件回调,而在document上执行preventDefault是不起作用的。
3.使用fastclick
fastclick也是使用事件委托(FastClick.attach(document.body, options);),但是冒泡到body上后,通过tap原理来判断是否单击,是则重新构造一个点击事件dispatch到原来的元素上,触发元素上的绑定事件,由于在tap事件后触发click,所以解决了延迟问题,并且300ms后,不再产生click事件,所以解决了”点透“问题。

FastClick.prototype.sendClick = function(targetElement, event) {
    ……   
    clickEvent = document.createEvent('MouseEvents');           
    clickEvent.initMouseEvent(this.determineEventType(targetElement), 
       true, true, window, 1, touch.screenX, touch.screenY,  touch.clientX,  touch.clientY, false, false, false, false, 0, null);      
    clickEvent.forwardedTouchEvent = true;
    targetElement.dispatchEvent(clickEvent);
};

到了这里,我们知道,最好的解决兼容PC和移动端的点击事件的办法是引入fastclick。然而我现在想要实现的是各种触摸事件——gg——既然要实现各种触摸事件,那就暂时不考虑PC的问题,所以考虑使用hammer.js

hammer.js

使用hammer.js实现qq消息中拖出删除画面的效果

在vue中使用hammer.js

使用方法:

<div  v-touch:panleft="onPanLeft"  v-touch:panright="onPanRight">

事件对象

TouchEvent 是一类描述手指在触摸平面(触摸屏、触摸板等)的状态变化的事件。这类事件用于描述一个或多个触点,使开发者可以检测触点的移动,触点的增加和减少,等等。
每 个 Touch对象代表一个触点; 每个触点都由其位置,大小,形状,压力大小,和目标 element描述。 TouchList 对象代表多个触点的一个列表

1) TouchEvent

TouchEvent的属性继承了 UIEventEvent
三个重要属性:
TouchEvent.changedTouches: 一个 TouchList 对象,包含了代表所有从上一次触摸事件到此次事件过程中,状态发生了改变的触点的 Touch 对象。
TouchEvent.targetTouches: 一个 TouchList 对象,是包含了如下触点的 Touch 对象:触摸起始于当前事件的目标 element 上,并且仍然没有离开触摸平面的触点。
TouchEvent.touches: 一 个 TouchList 对象,包含了所有当前接触触摸平面的触点的 Touch 对象,无论它们的起始于哪个 element 上,也无论它们状态是否发生了变化。

2) TouchList详解

只读属性:length返回这个TouchList中Touch对的个数。(就是有几个手指接触到了屏幕)
方法:item(index)返回TouchList中指定索引的Touch对象

3) Touch详解
touch说明

touch类事件

  1. 事件基础
    触摸事件,有touchstart touchmove touchend touchcancel 四种之分
    1.touchstart:手指触摸到屏幕会触发
    当用户手指触摸到的触摸屏的时候触发。事件对象的 target 就是touch 发生位置的那个元素。
    2.touchmove:当手指在屏幕上移动时,会触发
    当用户在触摸屏上移动触点(手指)的时候,触发这个事件。一定是先要触发touchstart事件,再有可能触发 touchmove 事件。 3.touchmove 事件的target 与最先触发的 touchstart 的 target 保持一致。touchmove事件和鼠标的mousemove事件一样都会多次重复调用,所以,事件处理时不能有太多耗时操作。不同的设备,移动同样的距离 touchmove 事件的触发频率是不同的。 有一点需要注意:即使手指移出了 原来的target 元素,则 touchmove 仍然会被一直触发,而且 target 仍然是原来的 target 元素。
    4.touchend:当手指离开屏幕时,会触发。
    当用户的手指抬起的时候,会触发 touchend 事件。如果用户的手指从触屏设备的边缘移出了触屏设备,也会触发 touchend 事件。5.touchend 事件的 target 也是与 touchstart 的 target 一致,即使已经移出了元素。
    6.touchcancel:可由系统进行的触发(如电话接入或者弹出信息),比如手指触摸屏幕的时候,突然电话来了,或者系统中其他打断了touch的行为,则可以触发该事件。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 一、 基础事件 1.click事件 单击事件,类似于PC端的click,但在移动端中,连续click的触发有200...
    满天繁星_28c5阅读 646评论 0 0
  • 在前端的移动Web开发中,有一部分事件只在移动端产生,如触摸相关的事件。接下来给大家简单总结一下移动端的事件。 1...
    IT老马阅读 5,059评论 1 20
  • 一、 基础事件 1.click事件 单击事件,类似于PC端的click,但在移动端中,连续click的触发有200...
    致自己_cb38阅读 499评论 0 0
  • 移动端事件(touchEvent) 现在随着移动设备的出现,鼠标事件不能够满足多指触控的事件需求,再加上click...
    Robyn_Luo阅读 169评论 0 1
  • 参考文章:在手持设备上使用 touchstart 事件代替 click 事件是不是个好主意 移动端兼容问题研究 j...
    jsAllen阅读 9,856评论 2 15