【发布时间】:2020-06-06 23:18:51
【问题描述】:
最近的一份 Lighthouse 报告指出了以下问题。
不使用被动侦听器来提高滚动性能
它还提到...
考虑将您的触摸和滚轮事件侦听器标记为
passive,以提高页面的滚动性能。
我该如何解决这个问题?它似乎与jQuery有关。
【问题讨论】:
标签: javascript jquery lighthouse
最近的一份 Lighthouse 报告指出了以下问题。
不使用被动侦听器来提高滚动性能
它还提到...
考虑将您的触摸和滚轮事件侦听器标记为
passive,以提高页面的滚动性能。
我该如何解决这个问题?它似乎与jQuery有关。
【问题讨论】:
标签: javascript jquery lighthouse
2016年https://github.com/jquery/jquery/issues/2871有一个关于这个话题的长帖
简而言之:
jQuery.event.special.touchstart = {
setup: function( _, ns, handle ){
this.addEventListener("touchstart", handle, { passive: true });
}
};
2021 年更新:在 jquery 之后添加以下代码。这将修复它并删除 Pagespeed 警告
jQuery.event.special.touchstart = {
setup: function( _, ns, handle ) {
this.addEventListener("touchstart", handle, { passive: !ns.includes("noPreventDefault") });
}
};
jQuery.event.special.touchmove = {
setup: function( _, ns, handle ) {
this.addEventListener("touchmove", handle, { passive: !ns.includes("noPreventDefault") });
}
};
jQuery.event.special.wheel = {
setup: function( _, ns, handle ){
this.addEventListener("wheel", handle, { passive: true });
}
};
jQuery.event.special.mousewheel = {
setup: function( _, ns, handle ){
this.addEventListener("mousewheel", handle, { passive: true });
}
};
【讨论】:
.on 进行重大改革,并进行重大更改。
这已经成功了!
// Passive event listeners
jQuery.event.special.touchstart = {
setup: function( _, ns, handle ) {
this.addEventListener("touchstart", handle, { passive: !ns.includes("noPreventDefault") });
}
};
jQuery.event.special.touchmove = {
setup: function( _, ns, handle ) {
this.addEventListener("touchmove", handle, { passive: !ns.includes("noPreventDefault") });
}
};
【讨论】:
!之前的ns.includes
如何使事件侦听器被动以提高滚动性能。为了解决这个问题-:
<script>!function(e){"function"==typeof define&&define.amd?define(e):e()}(function(){var e,t=["scroll","wheel","touchstart","touchmove","touchenter","touchend","touchleave","mouseout","mouseleave","mouseup","mousedown","mousemove","mouseenter","mousewheel","mouseover"];if(function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){e=!0}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e}()){var n=EventTarget.prototype.addEventListener;e=n,EventTarget.prototype.addEventListener=function(n,o,r){var i,s="object"==typeof r&&null!==r,u=s?r.capture:r;(r=s?function(e){var t=Object.getOwnPropertyDescriptor(e,"passive");return t&&!0!==t.writable&&void 0===t.set?Object.assign({},e):e}(r):{}).passive=void 0!==(i=r.passive)?i:-1!==t.indexOf(n)&&!0,r.capture=void 0!==u&&u,e.call(this,n,o,r)},EventTarget.prototype.addEventListener._original=e}});</script>
【讨论】: