重載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方法雖然很酷,但是由於響應速度快了,所以有時候也有麻煩,比如當你手指在滾動屏幕時觸碰到添加了方法的元素上立刻就會有反應從而容易產生誤操作

 

測試的手機有限,所以方法靠不靠譜,同學,請慎用。

 

 

 

========================================================

 

轉載處請注明:博客園偷飯貓willian12345@126.com 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM