zepto tap 「點透」的解決

觸發點透事件的緣由:
因爲兩個div重合,例如:一個div調用show(),一個div調用hide(),這個時候當點擊上層的div($up)的時候就會影響到下層的那個div($down),使其也觸發相應的事件。ios

解決辦法:
(1)
github上fastclick庫,它也能規避移動設備上click事件的延遲響應,https://github.com/ftlabs/fastclick
將它用script標籤引入頁面(該庫支持AMD,因而你也能夠按照AMD規範,用諸如require.js的模塊加載器引入),而且在dom ready時初始化在body上,如:git

$(function(){github

    new FastClick(document.body);npm

})瀏覽器

而後給須要「無延遲點擊」的元素綁定click事件(注意再也不是綁定zepto的tap事件)便可。
固然,你也能夠不在body上初始化它,而在某個dom上初始化,這樣,只有這個dom和它的子元素才能享受「無延遲」的點擊
進一步,對於zepto,若是你打算繼續使用它,那麼它的tap相關事件已經沒有用了,咱們能夠本身build一個無「touch」模塊的zepto,以便減少zepto文件的大小和提升運行效率。zepto的github頁面有定製化模塊的方法,見https://github.com/madrobby/zepto的building部分。dom

例:npm install fastclick後引入ide

(2)ui

思路是優先觸發上層事件,讓上層事件快於下層事件的觸發,並阻止默認事件。事件

    1.一個優先於下面的捕獲的事件
    2.而且經過這個事件阻止掉默認行爲(下面的對click事件的捕獲,在ios的safari,click的捕獲被認爲和滾屏、點擊輸入框彈起鍵盤等同樣,是一種瀏覽器默認行爲,便可以被event.preventDefault()阻止的行爲)。
例如,將tap事件改成touchend,這樣就直接在上層元素被捕獲,而不是在body上才被捕獲了,知足了1;再在內部使用preventDefault()解決了2,代碼以下:ip

$up.on('touchend',function(e){ // 改變了事件名稱,tap是在body上才被觸發,而touchend是原生的事件,在dom自己上就會被捕獲觸發     

     $up.hide()     ;

     e.preventDefault(); // 阻止「默認行爲」

})

(3)

延遲必定的時間(300ms+)來處理事件

$("#test").on("tap", function (event) {

       setTimeout(function(){

       //本身想作的操做

     },320);

 });

相關文章
相關標籤/搜索