點透主要是因爲兩個div重合,例如:一個div調用show(),一個div調用hide();這個時候當點擊上面的div的時候就會影響到下面的那個div;html
解決辦法主要有2種:ios
1.github上有一個叫作fastclick的庫,它也能規避移動設備上click事件的延遲響應,https://github.com/ftlabs/fastclick
將它用script標籤引入頁面(該庫支持AMD,因而你也能夠按照AMD規範,用諸如require.js的模塊加載器引入),而且在dom ready時初始化在body上,如:git
$(function(){ new FastClick(document.body); })
而後給須要「無延遲點擊」的元素綁定click事件(注意再也不是綁定zepto的tap事件)便可。
固然,你也能夠不在body上初始化它,而在某個dom上初始化,這樣,只有這個dom和它的子元素才能享受「無延遲」的點擊
進一步,對於zepto,若是你打算繼續使用它,那麼它的tap相關事件已經沒有用了,咱們能夠本身build一個無「touch」模塊的zepto,以便減少zepto文件的大小和提升運行效率。zepto的github頁面有定製化模塊的方法,見https://github.com/madrobby/zepto的building部分。github
2.根據分析,若是不引入其它類庫,也不想本身按照上述fastclcik的思路再開發一套東西,須要
1.一個優先於下面的「divClickUnder」捕獲的事件
2.而且經過這個事件阻止掉默認行爲(下面的「divClickUnder」對click事件的捕獲,在ios的safari,click的捕獲被認爲和滾屏、點擊輸入框彈起鍵盤等同樣,是一種瀏覽器默認行爲,便可以被event.preventDefault()阻止的行爲)。
如,將tap事件改成touchend(雖然意思確定不徹底同樣,並且不夠優雅),這樣就直接在「divTapAbove」被捕獲,而不是在body上才被捕獲了,知足了1;再在內部使用preventDefault()解決了2,代碼以下:瀏覽器
$divTapAbove.on('touchend',function(e){ // 改變了事件名稱,tap是在body上才被觸發,而touchend是原生的事件,在dom自己上就會被捕獲觸發 $divTapAbove.hide() $output.html($output.html() + 'tap<br/>') e.preventDefault(); // 阻止「默認行爲」 })