touch事件兼容性处理
作者:互联网
在用图表插件的时候默认图表区域可以正常左右滑动,但是测试的时候发现在有些安卓机型上滑动不是特别流畅,经过一系列排查发现是默认的滚动事件影响到了,于是在touch事件里面阻止了浏览器默认事件:
e.preventDefault();
但是新的问题又产生了,阻止了默认事件后,没法在图表区域上下滑动来滚动页面,在对于小屏幕的用户体验非常差,可能图表区域就占了3/2屏幕,就根本没法进行页面的滚动。于是乎找了新的方法,先上最后解决这个bug的代码:
$('#selector').bind('touchstart',function(e){
var point = e.touches ? e.touches[0] : e;
$('#selector').attr('pointX', point.pageX);
$('#selector').attr('pointY', point.pageY);
});
$('#selector').bind('touchmove',function(e){
var point= e.touches ? e.touches[0] : e;
var deltaX= point.pageX -$('#selector').attr('pointX');
var deltaY= point.pageY -$('#selector').attr('pointY');
if( deltaY && Math.abs(deltaY / deltaX) > 1.5){
return;
}
else{
event.preventDefault();
}
});
代码的原理就是在点击的时候通过pageX和pageY属性来获取点击位置的x,y轴坐标,当滑动的时候再次获取x,y轴坐标,通过将deltaY / deltaX得到的值与界限值1.5进行对比,如图:
当起始点为(0,0),滑动的角度在蓝色阴影区域的时候就默认是上下滑动,这个时候就不做处理,触发默认的浏览器事件。而当滑动角度在其他区域的时候就默认是左右滑动,这个时候就要阻止浏览器的默认事件。这样处理用户的体验会好很多。
当然那个1.5的比例也可以自行调整,我这里就以tan3/2角度为界限。
标签:touches,兼容性,point,deltaY,默认,selector,事件,touch,滑动 来源: https://www.cnblogs.com/baimeishaoxia/p/12841085.html