Zepto tap 穿透bug、解決移動端點擊穿透問題

當兩個層重疊在一塊兒時,或是有個彈窗,使用Zepto的tap事件時,點擊上面的一層時會觸發下面一層的事件,特別是底層若是是input框時,必「穿 透」,javascript

現象緣由:php

zepto的tap經過兼聽綁定在document上的touch事件來完成tap事件的模擬的,及tap事件是冒泡到document上觸發的css

再點擊完成時的tap事件(touchstart\touchend)須要冒泡到document上纔會觸發,而在冒泡到document以前,用 戶手的接觸屏幕(touchstart)和離開屏幕(touchend)是會觸發click事件的,由於click事件有延遲觸發(這就是爲何移動端不 用click而用tap的緣由)(大概是300ms,爲了實現safari的雙擊事件的設計),因此在執行完tap事件以後,彈出來的選擇組件馬 上就隱藏了,此時click事件還在延遲的300ms之中,當300ms到來的時候,click到的其實不是完成而是隱藏以後的下方的元素,若是正下方的 元素綁定的有click事件此時便會觸發,若是沒有綁定click事件的話就當沒click,可是正下方的是input輸入框(或者select選擇框或 者單選複選框),點擊默認聚焦而彈出輸入鍵盤,也就出現了上面的點透現象。html

解決方法以下:

一、使用github上有一個叫作fastclick的庫;java

二、監聽touchend事件,並在事件中使用preventDefault()阻止冒泡;jquery

$(".js-egg-close").on("touchend", function(e){  //這裏使用touchstart事件也是能夠的,
    e.preventDefault();
     $('.sec_dlg_eggs').remove();
     $(".eggs_bg").remove();
});css3

三、使用CSS3的pointer-events=true,pointer-events=none切換來實現;git

4.延遲必定的時間來處理事件。本人測試是超過320毫秒就不會出現穿透,與jQuery的動畫(fadeIn(),fadeOut())等配合,我的感受良好;github

5.若是還不奏效,終極解決方案是用click提代tap;sublime-text

設置點擊事件爲_tap

_tap = touchend in document ? "touchend":"click"

這樣在執行的過程當中就能夠直接調用div.on(_tap, function(){}) 

相關文章
相關標籤/搜索