移动端touch事件影响click事件以及在touchmove添加preventDefault致使页面没法滚动的解决方法

转自:http://www.qdfuns.com/notes/21896/30348b857757f18cde60e7b4c885fe6e.htmlhtml

 

这两天本身在写一个手机网页,用到了触屏滑动的特效,就是往右滑动的时候左侧隐藏的菜单从左边划出来。

作完以后在手机原生浏览器中运行正常,但在QQ和微信中打开,发现touchmove只会触发一次,并且touchend也常常不触发。

以后百度了一下这个问题,缘由是

主要是因为200ms超时致使内核不必定会一直处理touchmove事件,一旦超时会将后续全部的事件转交给UI处理,致使touchmove不会一直触发。

为了解决开发者须要,建议开发者在touchstart时调用event.preventDefault,这样就能够保证内核会一块儿触发touchmove事件了。

地址:http://bbs.mb.qq.com/thread-201794-1-1.html
根据上面所说,在touchstart中添加了event.preventDefault()方法,在QQ和微信中果真正常了。

可是!!!页面中的超连接点击没反应了!!!给其余地方加的click事件也不触发了!!!

以后继续百度,得知当在移动端上点击屏幕时,会依次触发touchstart,touchmove,touchend,click事件。

以后测试了一下,发现正确的触发过程应该是:touchstart→touchmove→touchend或者touchstart→touchend→click。

若是在点击屏幕的时候手指滑动的话,是不会触发click事件的。

参考地址:http://www.tuicool.com/articles/3QZ7jeV
上面说event.preventDefault()的方法,会阻止事件的默认行为。能够经过调用preventDefault()方法,能够阻止后面事件的触发。

我知道event.preventDefault()会阻止a标签默认的动做(跳转到href指定的页面),可是为何click也不触发了呢?

以后我大胆推测了一下:

会不会是由于在移动端click事件的触发条件就是必须touchstart和touchend同时触发才能触发click呢?

我在touchstart中调用了event.preventDefault方法,是否是让浏览器误觉得没有触发touchstart事件,只触发了touchend事件,因此没有触发click事件呢?

以后我删除了touchstart中的event.preventDefault方法,果真超连接和click事件都触发了,可是前面说的问题又出现了,在QQ和微信中touchmove和touchend又出问题了。

怎么办呢?

后来忽然脑壳灵光一闪,既然在touchstart中加了event.preventDefault会致使不触发click事件,那我在touchmove中加能够吧?

抱着试一试的心态,果真好了,click能顺利触发,QQ和微信中也没有问题,我觉得这样就行了,可是为何页面不能滚动了?

原来touchmove中添加event.preventDefault方法以后会阻止浏览器默认的滚动。。。

因此页面没法滚动了,以后又去找找找,找了好久一直没找到怎么解决这个问题,忽然想起以后用的一个移动端的图片轮播插件,

为何他们能够左右滑动,不影响click事件和a标签,也不影响页面的滚动。

而后我打开了这个插件的源码,终于在touchmove中找到了答案

在touchmove中有这样一段代码(下面是我本身抄过来简化过的):
浏览器

 

var w = x<0?x*-1:x;     //x轴的滑动值
var h = y<0?y*-1:y;     //y轴的滑动值
if(w>h){                //若是是在x轴中滑动
   event.preventDefault();
}

 

就是在touchmove中判断x轴和y轴的移动值,判断当前是往哪一个方向滑动,若是是在x轴上滑动(左右),就调用event.preventDefault()方法,若是是在y轴上滑动(上下),就不调用event.preventDefault()。

而后测试一下,QQ和微信中特效没有问题,click事件和a标签连接也能够顺利触发,页面滚动也没有问题。

全部问题终于解决了。。



总结一下:

在QQ和微信(固然还包括其余浏览器,不过我没测试过)中若是有须要用到touch事件作的特效必定要在touchstart或者touchmove中添加event.preventDefault()方法。

在touchstart中若是有event.preventDefault()方法, 将不会触发click事件和a标签方法。在这里可使用tap代替click,可是a标签的话就不太方便了。

若是在touchmove中有event.preventDefault()方法,最好加上方向判断,固然若是你页面内容不须要滚动条就不须要加判断了。微信

相关文章
相关标签/搜索