額,這個標題取的還真是挺裝的...
其實我想表達的是jquery click事件如何在移動端自動轉換成touchstart事件。
因為移動端click事件會比touchstart事件慢幾拍
移動裝置某個元素上事件執行順序是:
touchstart
touchmove
touchend
click{mousedown->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兩次
也就是說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