發發牢騷
移動web端裡摸爬滾打這麼久踩了不少坑,有一定移動web端經驗的同學一定被click困擾過。我也不列外。一路走來被虐的不行,fastclick、touchend、iscroll什麼的都用過,各有優劣,都不能一步到位。最後實在是被逼無奈,翻閱了不少資料,自定義了一個tap。
效果預覽
廢話不多說先上效果 移動端預覽 移動端!移動端!移動端!
一探真假
真的只有10行
外掛是基於jQuery的,上程式碼。
//自定義tap
$(document).on("touchstart", function(e) {
if(!$(e.target).hasClass("disable")) $(e.target).data("isMoved", 0);
});
$(document).on("touchmove", function(e) {
if(!$(e.target).hasClass("disable")) $(e.target).data("isMoved", 1);
});
$(document).on("touchend", function(e) {
if(!$(e.target).hasClass("disable") && $(e.target).data("isMoved") == 0) $(e.target).trigger("tap");
});
既然說是10行程式碼搞定,那麼就一定是10行。
實現原理
基於touchstart、touchmove、touchend這三個事件,通過事件委託的方式來實現tap事件。
e.target是事件源的觸發節點,$(e.target)是該節點的jQuery封裝物件, 預設不處理含有disable class的物件。
第一步:監聽touchstart事件,事件觸發後通過jQuery的data方法設定該物件的isMoved狀態為0。
第二步:監聽touchmove事件,事件觸發後通過jQuery的data方法設定該物件的isMoved狀態為1。
第三步:監聽touchend事件,事件觸發後判斷該物件是否touchend過,沒有則觸發tap事件。
使用方法
把上面的10行程式碼放在jQuery或者zepto的最後面,用法和一般事件一樣
其他
目前還沒有做PC端的相容,移動web端的機型測試做的不夠多,後續會慢慢補上。如果在使用中遇到了什麼問題可以留言。