以前小言遇到問題都是以解決為目標(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)行為了。