zepto的tap事件的點透問題的幾種解決方案


你可能碰到過在頁面上創建一個彈出層,彈出層有個關閉的按鈕,你點了這個按鈕關閉彈出層后,這個按鈕正下方的內容也會執行點擊事件(或打開鏈接)。這個被定義為這是一個“點透”現象。

以前,我也聽到過tap的點透問題,想着阻止一下默認事件或冒泡就好,但是試了好久都不管用,於是就上網查資料,結果網上果真有人解決了此問題。

從zepto官方插件touchJS可以看出zepto的tap通過兼聽綁定在document上的touch事件來完成tap事件的模擬的,即tap事件是冒泡到document上觸發的。

再點擊完成時的tap事件(touchstart\touchend)需要冒泡到document上才會觸發,而在冒泡到document之前,用戶手的接觸屏幕(touchstart)和離開屏幕(touchend)是會觸發click事件的,因為click事件有延遲觸發(這就是為什么移動端不用click而用tap的原因,大概是300ms,為了實現safari的雙擊事件的設計),所以在執行完tap事件之后,彈出來的遮罩層馬上就隱藏了,此時click事件還在延遲的300ms之中,當300ms到來的時候,click到的其實不是完成而是隱藏之后的下方的元素,如果正下方的元素綁定的有click事件此時便會觸發,如果沒有綁定click事件的話就當沒click,但是正下方的是input輸入框(或者select選擇框或者單選復選框或超鏈),點擊默認聚焦而彈出輸入鍵盤或超鏈,也就出現了上面的點透現象。

解決方案:

方案一:來得很直接github上有個fastclick可以完美解決https://github.com/ftlabs/fastclick


引入fastclick.js,因為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);

方案二:用touchend代替tap事件並阻止掉touchend的默認行為preventDefault()

$("#cbFinish").on("touchend", function (event) {
     //很多處理比如隱藏什么的
     event.preventDefault();
});
使用此方法的話,很可能會阻止掉頁面上的其他事件,所以我用的是第一種解決方案。


方案三:延遲一定的時間(300ms+)來處理事件

$("#cbFinish").on("tap", function (event) {
     setTimeout(function(){
     //很多處理比如隱藏什么的
     },320);
});    

這種方法其實很好,可以和fadeInIn/fadeOut等動畫結合使用,可以做出過度效果。

理論上上面的方法可以完美的解決tap的點透問題,如果真的倔強到不行,用click。

 

本文出自:http://www.bubuko.com/infodetail-649496.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM