1. 程式人生 > >Unable to preventDefault inside passive event listener

Unable to preventDefault inside passive event listener

microsoft 註冊 方式 ont The dev 觸發 pointer fun

做人還是不能懶,不對,要懶得聰明。工作一年來經常會遇到控制臺如下提示,躲不了了,就各種找資料,事實證明遇到問題一定要及時解決,不然總還會碰到的:

  

Unable to preventDefault inside passive event listener due to target being treated as passive. See https://www.chromestatus.com/features/5093566007214080

造成原因:

由於瀏覽器必須要在執行事件處理函數之後,才能知道有沒有掉用過 preventDefault() ,這就導致了瀏覽器不能及時響應滾動,略有延遲。
所以為了讓頁面滾動的效果如絲般順滑,從 chrome56 開始,在 window、document 和 body 上註冊的 touchstart 和 touchmove 事件處理函數,會默認為是 passive: 
true。瀏覽器忽略 preventDefault() 就可以第一時間滾動了。

解決方法:

1、註冊處理函數時,用如下方式,明確聲明為不是被動的
window.addEventListener(‘touchmove‘, func, { passive: false }) (當觸發的事件為click時 此方法可以完美的解決)

2、應用 CSS 屬性 touch-action: none; 這樣任何觸摸事件都不會產生默認行為,但是 touch 事件照樣觸發。
touch-action 還有很多選項,詳細請參考touch-action

Unable to preventDefault inside passive event listener