滑動(dòng)時(shí)候警告:Unable to preventDefault inside passive event listener

移動(dòng)端Web界面滾動(dòng)性能優(yōu)化 Passive event listeners

最近用Sortable.js插件寫h5拖拽排序的時(shí)候,拖拽能執(zhí)行,但是看控制臺(tái)的時(shí)候報(bào)錯(cuò),后來(lái)百度查原來(lái)是頁(yè)面用了touch事件
控制臺(tái)打印如下警告:

[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. 
See https://www.chromestatus.com/features/5093566007214080
解決辦法1:

在touch的事件監(jiān)聽方法上綁定第三個(gè)參數(shù){ passive: false },
通過(guò)傳遞 passive 為 false 來(lái)明確告訴瀏覽器:事件處理程序調(diào)用 preventDefault 來(lái)阻止默認(rèn)滑動(dòng)行為。

elem.addEventListener(
  'touchstart',
  fn,
  { passive: false }
);
解決辦法2:
 * { touch-action: pan-y; } 

使用全局樣式樣式去掉

Passive event listeners

2016年Google I/O上提出的概念,目的是用來(lái)提升頁(yè)面滑動(dòng)的流暢度。
For instance, in Chrome for Android 80% of the touch events that block scrolling never actually prevent it. 10% of these events add more than 100ms of delay to the start of scrolling, and a catastrophic delay of at least 500ms occurs in 1% of scrolls.

在 Android 版 Chrome 瀏覽器的 touch 事件監(jiān)聽器的頁(yè)面中,80% 的頁(yè)面都不會(huì)調(diào)用 preventDefault 函數(shù)來(lái)阻止事件的默認(rèn)行為。在滑動(dòng)流暢度上,有 10% 的頁(yè)面增加至少 100ms 的延遲,1% 的頁(yè)面甚至增加 500ms 以上的延遲。

由于瀏覽器無(wú)法預(yù)先知道一個(gè)事件處理函數(shù)中會(huì)不會(huì)調(diào)用 preventDefault(),它需要等到事件處理函數(shù)執(zhí)行完后,才能去執(zhí)行默認(rèn)行為,然而事件處理函數(shù)執(zhí)行是要耗時(shí)的,這樣一來(lái)就會(huì)導(dǎo)致頁(yè)面卡頓,也就是說(shuō),當(dāng)瀏覽器等待執(zhí)行事件的默認(rèn)行為時(shí),大部分情況是白等了。

如果 Web 開發(fā)者能夠提前告訴瀏覽器:“我不調(diào)用 preventDefault 函數(shù)來(lái)阻止事件事件行為”,那么瀏覽器就能快速生成事件,從而提升頁(yè)面性能,Passive event listeners 的提出就解決了這樣的問(wèn)題。

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

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

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