Unable to preventDefault inside passive event listener due to target being treated as passive報錯的深度剖析

以前小言遇到問題都是以解決為目標(biāo),畢竟公司也是想讓你快速解決問題。至于你是否弄懂了這個問題沒人說你,但是想要提高自己還是要知道問題的根源和原理,那么一起看下這個問題是原因和如何解決的:

字面的意思翻譯過來是:由于目標(biāo)被視為被動事件監(jiān)聽器,無法在被動事件監(jiān)聽器中阻止default?

意思直接告訴我們在事件監(jiān)聽器內(nèi)無法阻止 default

可能還是有些模糊,綜合分析一下吧。要知道這里報錯的default是什么,點(diǎn)擊報錯的行數(shù)可以知道是preventDefault(),這個是阻止默認(rèn)事件。意思就是瀏覽器在事件監(jiān)聽器內(nèi)無法阻止默認(rèn)事件,所以你添加的阻止默認(rèn)事件是不符合瀏覽器解析語法的所以報錯提醒。

其實(shí)到這里已經(jīng)很明確了,瀏覽器不識別這一套寫法,那就是寫法錯了,語法錯誤。怎么回事?以前這么寫過啊,翻下資料才知道瀏覽器從 chrome56 開始,在 window、document 和 body 上注冊的 touchstart 和 touchmove 事件處理函數(shù),會默認(rèn)為是 passive: true。瀏覽器忽略 preventDefault() , e.preventDefault() ,會被瀏覽器忽略掉,并不會阻止默認(rèn)行為。所以我們應(yīng)該設(shè)置事件監(jiān)聽內(nèi)passive:false,這樣可以直接告訴瀏覽器這個監(jiān)聽事件不遵循默認(rèn)事件執(zhí)行:

elem.addEventListener(

? ??'touchstart',

? ??fn,

? ??{passive:false}

);

給監(jiān)聽器加個passive模式


passive監(jiān)聽器模式:

由于 touchstart 事件對象的 cancelable 屬性為 true,也就是說它的默認(rèn)行為可以被監(jiān)聽器通過 preventDefault() 方法阻止,那它的默認(rèn)行為是什么呢,通常來說就是滾動當(dāng)前頁面(還可能是縮放頁面),如果它的默認(rèn)行為被阻止了,頁面就必須靜止不動。但瀏覽器無法預(yù)先知道一個監(jiān)聽器會不會調(diào)用 preventDefault(),它能做的只有等監(jiān)聽器執(zhí)行完后再去執(zhí)行默認(rèn)行為,而監(jiān)聽器執(zhí)行是要耗時的,有些甚至耗時很明顯,這樣就會導(dǎo)致頁面卡頓。視頻里也說了,即便監(jiān)聽器是個空函數(shù),也會產(chǎn)生一定的卡頓,畢竟空函數(shù)的執(zhí)行也會耗時。

80% 的滾動事件監(jiān)聽器是不會阻止默認(rèn)行為的,也就是說大部分情況下,瀏覽器是白等了。所以,passive 監(jiān)聽器誕生了,passive 的意思是“順從的”,表示它不會對事件的默認(rèn)行為說 no,瀏覽器知道了一個監(jiān)聽器是 passive 的,它就可以在兩個線程里同時執(zhí)行監(jiān)聽器中的 JavaScript 代碼和瀏覽器的默認(rèn)行為了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容