Passive Event Listeners——讓頁面滑動更加流暢的新特性


Passive Event Listeners - 被動事件監聽器

在寫webapp頁面的時候,Chrome 提醒 

code
1
<code>[Violation] Added non-passive event listener to a scroll-blocking 'touchstart' event. Consider marking event handler as 'passive' to make the page more responsive.</code>

翻譯過來如下:

違反:沒有添加被動事件監聽器來阻止'touchstart'事件,請考慮添加事件管理者'passive',以使頁面更加流暢。

出現如上提示這可能是由於console的過濾器選擇了Verbose

Passive Event Listeners——讓頁面滑動更加流暢的新特性

Verbose-冗長,就是事無具細的把所有log顯示出來

Info-顯示開發者自定義的log及錯誤信息

Warnings-顯示危險信息

Errors-顯示錯誤信息

一般默認的是Info,不會提示這個提醒,雖然這並不影響代碼的正常運行,但 是既然提醒了還是弄明白是什么原因的好一些。

這是因為Chrome51版本以后,Chrome增加了新的事件捕獲機制-Passive Event Listeners

Passive Event Listeners就是告訴前頁面內的事件監聽器內部是否會調用preventDefault函數來阻止事件的默認行為,以便瀏覽器根據這個信息更好地做出決策來優化頁面性能。當屬性passive的值為true的時候,代表該監聽器內部不會調用preventDefault函數來阻止默認滑動行為,Chrome瀏覽器稱這類型的監聽器為被動(passive)監聽器。目前Chrome主要利用該特性來優化頁面的滑動性能,所以Passive Event Listeners特性當前僅支持mousewheel/touch相關事件

以前的事件捕獲代碼如下:

?
code
1
<code>document.addEventListener( "click" , fn, false / true )</code>

第三個參數決定了fn函數是在冒泡還是捕獲階段觸發。
現在第三個參數不但可以是布爾值,還可是一個對象

?
code
1
<code>document.addEventListener( "mousewheel" , fn, {passive: true })</code>

由於passive對象只在Chrome瀏覽器中支持,所以這里需要做一個兼容處理

?
code
1
2
3
4
5
6
7
8
9
10
11
12
13
<code>var passiveSupported = false ;
     try {
         var options = Object.defineProperty({}, "passive" , {
             get: function() {
                 passiveSupported = true ;
             }
         });
         window.addEventListener( "test" , null, options);
     } catch (err) {}
     function fn() {
         console. log ( "fn" )
     }
     document.addEventListener( "mousewheel" , fn, passiveSupported ? { passive: true } : false )</code>

再看Chrome調試會發現,Chrome已經不要提醒讓人頭的提醒。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM