web 移动端事件总结

参考文章:
在手持设备上使用 touchstart 事件代替 click 事件是不是个好主意
移动端兼容问题研究 javascript事件机制详解(涉及移动兼容)
读fastclick源码有感 彻底解决tap“点透”,提升移动端点击响应速度

实现一个移动端TODO应用,想添加一些触摸事件,之前无论PC还是移动端,都统一用click,现在细思恐极啊~~。一时半会想不出更好的实现方案,于是找了很多资料学习了一下,在此做个分享。

为什么移动端不用click

估计大家都知道,移动端的click有300ms延迟的问题,在移动端浏览器中,连续两次点击是缩放操作,所以在用户点击屏幕后,浏览器会检查在300ms内是否有另一次点击,如果没有则触发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是不起作用的。
解决“点透”问题:略。

  1. 使用fastclick
    使用方法参考:https://github.com/ftlabs/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);
};

另外的好处是

FastClick doesn't attach any listeners on desktop browsers.
Chrome 32+ on Android withwidth=device-width in the viewport meta tag doesn't have a 300ms delay

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

hammer.js

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


qq消息界面截图

最开始的实现方法是通过panstart、panmove、panend来实现滑动条的滑动距离和手指的滑动成相等关系,实现方法可以看我的codepan:
See the Pen <a href="http://codepen.io/jsAllen/pen/WGdBgN/">touch delete</a> by jsAllen (<a href="http://codepen.io/jsAllen">@jsAllen</a>) on <a href="http://codepen.io">CodePen</a>

不过这样的动画实现过程比较恶心,有好多的判断,后来在vue项目中,直接改用过渡,通过panleft、panright来修改translateX,再给tranlateX添加过渡。虽然效果明显弱了点,但操作流畅了许多。

在vue中使用hammer.js

在github上找了一下,发现有个vue-touch,更惊喜的是,这是个官方插件,不过项目使用的是vue2.0版本,而vue-touch暂不兼容vue2.0。看了一下issue,发现有人也遇到这个问题,然后又发现vue-touch有一个分支,已经做了兼容,哈哈。看了下源码,其实就是将hammer.js封装成指令。
使用方法:

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

就此解决了项目中的一个小小触摸事件,不过感觉后面的坑会很多,自己接触移动端事件比较少,所以后面还要不断的总结经验,寻找更加高效优雅的处理方法。

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

推荐阅读更多精彩内容