額,這個標題取的還真是挺裝的...jquery
其實我想表達的是jquery click事件如何在移動端自動轉換成touchstart事件。android
由於移動端click事件會比touchstart事件慢幾拍ios
移動設備某個元素上事件執行順序是:瀏覽器
touchstartapp
touchmove函數
touchend測試
click{mousedown->mousemove->mouseup}ui
click事件在移動設備上雖然會識別但倒是最後一個執行的,因此若是不把click事件換成touchstart事件的話,就可能形成延時致使交互上也慢了幾拍this
因此在移動端最好把click事件換成touchstart事件。spa
那麼如何添加事件比較簡單呢.
因而乎有了如下這種寫法:
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兩次
也就是說touchstart和mousedown的handle函數都執行了, 彷佛是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