重载jquery on方法实现click事件在移动端的快速响应

简介: 重载jquery on方法实现click事件在移动端的快速响应

额,这个标题取的还真是挺装的...

其实我想表达的是jquery click事件如何在移动端自动转换成touchstart事件。

因为移动端click事件会比touchstart事件慢几拍

移动设备某个元素上事件执行顺序是:

touchstart

touchmove

touchend

clickmousedown->mousemove->mouseup

 

click事件在移动设备上虽然会识别但却是最后一个执行的,所以如果不把click事件换成touchstart事件的话,就可能造成延时导致交互上也慢了几拍

所以在移动端最好把click事件换成touchstart事件。

那么如何添加事件比较简单呢.

于是乎有了以下这种写法:

var handle = function (e) {
  e.preventDefault(); // 阻止浏览器默认行为
  alert('fuck world');
}
$('body').on(‘touchstart mousedown’,  handle );

这样在pc端浏览器上面alert只执行一次,触发的事件是mousedown

ios设备safari浏览器上面alert也只执行一次,触发的事件是touchstart

为什么只执行一次?

秘密在于当执行的是touchstart后,preventDefault掉了后面的click就不执行了,“非常完美”.

 

^_^!  一如既往的android设备蛋疼是必须的,测试发现qq浏览器外其它浏览器都会alert两次

也就是说touchstartmousedownhandle函数都执行了, 似乎是e.preventDefault()没有起作用。具体原因不明...

因为要兼容,所以就没办法了只能通过判断是否支持touch事件来分别添加事件了..

那就扩展一个jquery方法插件吧仿一个on方法的插件方法比如名称为quickOn,(如果你连on方法怎么用都不知道,那你就走吧,离开这里...

 

 

;(function(){
        var isTouch = ('ontouchstart' in document.documentElement) ? 'touchstart' : 'click';
      if(!$.fn.quickOn){
            $.fn.quickOn= function(){
                arguments[0] = (arguments[0] === 'click') ? isTouch: arguments[0];
                return $.fn.on.apply(this, arguments);    
            };
        }
  })();

 

quickOn虽然名字尴尬了一点,但是能用,例如:

$('body').quickOn('click', function(){
    alert('fuck world') ;
})

 

额。。后来想想,为什么不直接重载jquery的on方法呢??

来吧,试试

;(function(){
        var isTouch = ('ontouchstart' in document.documentElement) ? 'touchstart' : 'click', _on = $.fn.on;
            $.fn.on = function(){
                arguments[0] = (arguments[0] === 'click') ? isTouch: arguments[0];
                return _on.apply(this, arguments); 
            };
    })();

这样暴力的来那么一下后,mmm....,on方法还是原来的用法,但如果你on的是click事件,那么在移动平台上会被替换成touchstart以迅速响应操作。

成功!!!

 

特别注意:

 

通过重载on方法虽然很酷,但是由于响应速度快了,所以有时候也有麻烦,比如当你手指在滚动屏幕时触碰到添加了方法的元素上立刻就会有反应从而容易产生误操作

 

测试的手机有限,所以方法靠不靠谱,同学,请慎用。

相关文章
|
28天前
|
JavaScript
jQuery 遍历 方法
jQuery 遍历 方法
30 5
|
15天前
|
XML JavaScript 数据格式
jquery中html()方法的使用
jquery中html()方法的使用
15 1
|
23天前
|
前端开发 JavaScript
jQuery - AJAX load() 方法
jQuery load() 方法是简单但强大的 AJAX 方法。
41 6
|
27天前
|
JavaScript 前端开发
jQuery 杂项方法
jQuery 杂项方法
27 2
|
28天前
|
JavaScript
jQuery 效果 方法
jQuery 效果 方法
13 3
|
27天前
|
JSON 前端开发 JavaScript
jQuery AJAX 方法
jQuery AJAX 方法
28 1
|
28天前
|
XML 前端开发 JavaScript
jQuery HTML / CSS 方法
jQuery HTML / CSS 方法
11 2
|
6天前
|
JavaScript 前端开发 API
深入理解jQuery:高效DOM操作与事件处理
【10月更文挑战第11天】深入理解jQuery:高效DOM操作与事件处理
8 0
|
9天前
|
存储 JSON JavaScript
jQuery 方法大全
jQuery 方法大全
8 0
|
29天前
|
JavaScript
jQuery 事件 方法
jQuery 事件 方法
13 0