1.github上有一個叫作fastclick的庫,它能規避移動設備上click事件的延遲響應https://github.com/ftlabs/fastclick將它用script標籤引入頁面(該庫支持AMD,可按照AMD規範,用require.js的模塊加載器引入),而且在dom ready時初始化在body上,如:$(function(){
new FastClick(document.body);
})
而後給須要「無延遲點擊」的元素綁定click事件(注意再也不是綁定zepto的tap事件)便可。
也能夠不在body上初始化它,而在某個dom上初始化,這樣,只有設個dom和它的子元素才能享受"無延遲"的點擊。
由於fastclick源碼不依賴其餘庫因此你能夠在原生的js前直接加上window.addEventListener( "load", function() {
FastClick.attach( document.body );
}, false );
或者有zepto或者jqm的js裏面加上$(function() {
FastClick.attach(document.body);
});
固然require的話就這樣:var FastClick = require("fastclick");
FastClick.attach(document.body, options);
實踐開發中,當元素綁定fastclick後,click響應速度比tap還要快一點。
2.對於B元素自己存在默認click事件的狀況,應用touchend代替tap事件並阻止掉A元素touchend的默認行爲preventDefault(),從而阻止click事件的產生。 $("#aa").on("touchend", function (event) {
//不少處理好比隱藏什麼的
event.preventDefault();
});
對於B元素自己沒有默認click事件的狀況(無a標籤等),應統一使用touch事件,統一代碼風格,而且因爲click事件在移動端的延遲要大不少,不利於用戶體驗,因此關於觸摸事件應儘可能使用touch相關事件。git
延遲必定的時間(300ms+)來處理事件
$("#aa").on("tap", function (event) {
setTimeout(function(){
//不少處理好比隱藏什麼的
},320);
});
這種方法其實很好,能夠和fadeInIn/fadeOut等動畫結合使用,能夠作出過分效果github
理論上上面的方法能夠完美的解決tap的點透問題,若是真的倔強到不行,改用click。特別是對於遮蓋浮層,因爲遮蓋浮層的點擊即便有小延遲也是沒有關係的,反而會有疑似更好的用戶體驗,因此這種狀況,能夠針對遮蓋浮層本身採用click事件,這樣就不會出現點透問題。瀏覽器
方法一:直接將上層元素的tap事件換成click事件(會出現300ms的延遲觸發事件)dom
方法二:在click事件觸發前阻止它,如在touchend的事件中使用e.preventDefault()來阻止後續的click事件ide
zepto爲什麼不使用e.preventDefault()來解決穿透問題?動畫
由於zepto的tap事件統一是在document的touchend時觸發的,若在這裏使用e.preventDefault(),那頁面上全部元素在touchend後觸發的事件都不會被執行了。ui