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进行对比,如图:

touch事件兼容性处理

当起始点为(0,0),滑动的角度在蓝色阴影区域的时候就默认是上下滑动,这个时候就不做处理,触发默认的浏览器事件。而当滑动角度在其他区域的时候就默认是左右滑动,这个时候就要阻止浏览器的默认事件。这样处理用户的体验会好很多。

当然那个1.5的比例也可以自行调整,我这里就以tan3/2角度为界限。

上一篇:git命令使用


下一篇:javascript-检测用户的意图是轻触还是在触觉设备上向上/向下滚动页面