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

Passive Event Listeners - 被動事件監聽器

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

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

翻譯過來以下:瀏覽器

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

出現如上提示這多是因爲console的過濾器選擇了Verbosewebapp

圖片描述

  • Verbose-冗長,就是事無具細的把全部log顯示出來ide

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

  • Warnings-顯示危險信息性能

  • Errors-顯示錯誤信息優化

通常默認的是Info,不會提示這個提醒,雖然這並不影響代碼的正常運行,但 是既然提醒了仍是弄明白是什麼緣由的好一些。spa

這是由於Chrome51版本之後,Chrome增長了新的事件捕獲機制-Passive Event Listeners翻譯

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

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

document.addEventListener("click", fn, false/true)

第三個參數決定了fn函數是在冒泡仍是捕獲階段觸發。
如今第三個參數不但能夠是布爾值,還但是一個對象

document.addEventListener("mousewheel", fn, {passive: true})

因爲passive對象只在Chrome瀏覽器中支持,因此這裏須要作一個兼容處理

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)

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

相關文章
相關標籤/搜索