本篇為轉載,原文鏈接:https://blog.csdn.net/lijingshan34/article/details/88350456
翻譯一下:chrome 監聽touch類事件報錯:無法被動偵聽事件preventDefault,是新版本chrome 瀏覽器報錯。
說明:說一下這個 preventDefault()是個什么鬼,這個是取消默認事件的,如果這個函數起作用的,比如默認的表單提交,a鏈接的點擊跳轉,就不好用了。
原因:google瀏覽器為了最快速的相應touch事件,做出的改變。
歷史:當瀏覽器首先對默認的事件進行響應的時候,要檢查一下是否進行了默認事件的取消。這樣就在響應滑動操作之前有那么一絲絲的耽誤時間。
現在:google就決定默認取消了對這個事件的檢查,默認時間就取消了。直接執行滑動操作。這樣就更加的順滑了。
但是瀏覽器的控制台就會進行錯誤提醒了。
具體情況:
從 chrome56 開始,在 window、document 和 body 上注冊的 touchstart 和 touchmove 事件處理函數,會默認為是 passive: true。瀏覽器忽略 preventDefault() 就可以第一時間滾動了。
導致下面的效果一致:
wnidow.addEventListener('touchmove', func) 效果和下面一句一樣 wnidow.addEventListener('touchmove', func, { passive: true })
這樣會出現新的問題:
如果在以上這 3 個元素的 touchstart 和 touchmove 事件處理函數中調用 e.preventDefault() ,會被瀏覽器忽略掉,並不會阻止默認行為。
各位親人們可以測試一下:
body { margin: 0; height: 2000px; background: linear-gradient(to bottom, red, green); } // 在 chrome56 中,照樣滾動,而且控制台會有提示,blablabla window.addEventListener('touchmove', e => e.preventDefault())
那么我們這些小程序員該怎么辦呢???
可以做到:
即不讓控制台提示,而且 preventDefault() 有效果呢?
兩個方案:
1、注冊處理函數時,用如下方式,明確聲明為不是被動的
window.addEventListener(‘touchmove’, func, { passive: false })
2、應用 CSS 屬性 touch-action: none; 這樣任何觸摸事件都不會產生默認行為,但是 touch 事件照樣觸發。
touch-action 還有很多選項,
詳細請參考:touch-action
————————————————
版權聲明:本文為CSDN博主「李景山-編程者」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lijingshan34/article/details/88350456