移動端在touch上一共有4個事件javascript
這裏會結合click對上面的事件進行討論, touch發生在click以前css
先上段代碼,直觀感覺一下html
<!DOCTYPE html> <html> <head> <style type="text/css"> #level0 { /* width: 500px; height: 500px; */ } #level1-0 { background: red; width: 500px; height: 500px; } #level1-1 { background: green; width: 500px; height: 500px; } </style> </head> <body> <div id="level0"> <div id="level1-0"> </div> <div id="level1-1"> </div> </div> </body> <script type="text/javascript"> var level10 = document.getElementById("level1-0"); level10.addEventListener('touchstart', function(e) { console.log(1); }); level10.addEventListener('touchmove', function(e) { console.log(2); }); level10.addEventListener('touchend', function(e) { console.log(3); }); level10.onclick = function() { console.log(5); } document.body.onclick = function() { console.log('6'); } </script> </html>
level10.addEventListener('touchstart', function(e) { console.log(1); e.preventDefault(); });
點擊的時候 發現 只有 1 3, 說明click被阻止了,固然在touchend裏面加效果也同樣,因此 在touch事件裏面加 e.preventDefault能夠取消系統產生的click事件, 固然不會阻止後面的touch事件。java
產生點透問題的緣由, 能夠先看看代碼吧瀏覽器
<!DOCTYPE html> <html> <head> <style type="text/css"> #level0 { /* width: 500px; height: 500px; */ position: relative; } #level1-0 { position: absolute; z-index: 1; background: red; width: 500px; height: 500px; } #level1-1 { background: green; width: 500px; height: 500px; } </style> </head> <body> <div id="level0"> <div id="level1-0"> </div> <div id="level1-1"> </div> </div> </body> <script type="text/javascript"> var level10 = document.getElementById("level1-0"); var level11 = document.getElementById("level1-1"); level10.addEventListener('touchstart', function(e) { level10.style.display = 'none'; }); level11.onclick = function() { console.log('level11莫名被點擊了'); } </script </html>
level11莫名被點擊了
, 這就是點透
當手指觸摸到屏幕的時候,系統生成兩個事件,一個是touch 一個是click,touch先執行,touch執行完成後,A從文檔樹上面消失了,並且因爲移動端click還有延遲200-300ms的關係,當系統要觸發click的時候,發如今用戶點擊的位置上面,目前離用戶最近的元素是B,因此就直接把click事件做用在B元素上面了
.
level10.addEventListener('touchend', function(e) {
e.preventDefault();
});
固然點透問題,還有其餘的解決方法,關鍵是 要麼是需求本次系統生成的click事件,要麼是當系統觸發click的時候,當前的觸發touch的那個dom節點還存在。好比將其一延遲3s在關閉dom
setTimeout(() => { level10.style.display = 'none'; }, 300);