我正在使用锤子进行拖动,在加载其他东西时它会变得不稳定,正如此警告信息告诉我的那样。
触摸' touchstart'输入事件由于延迟了X ms 主线忙。考虑将事件处理程序标记为“被动'至 使页面更具响应性。
所以我试图添加“被动”#39;像这样的听众
Hammer(element[0]).on("touchstart", function(ev) {
// stuff
}, {
passive: true
});
但我仍然收到此警告。
答案 0 :(得分:235)
对于第一次接收此警告的人来说,这是由于最近(2016年夏天)在浏览器中实现了一种称为被动事件监听器的前沿功能。来自https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md:
被动事件侦听器是启用DOM规范的新功能 开发人员选择通过消除更好的滚动性能 需要滚动以阻止触摸和滚轮事件侦听器。 开发人员可以使用{passive:true}注释触摸和轮式监听器 表示他们永远不会调用preventDefault。此功能 在Chrome 51,Firefox 49中发布并登陆WebKit。 For full official explanation read more here.
另请参阅:What are passive event listeners?
如果您通过JavaScript库间接处理事件,您可能会受到特定库对该功能的支持。截至2016年8月,它似乎没有任何主要图书馆实施支持。一些例子:
答案 1 :(得分:6)
对于使用jquery-ui-touch-punch的jquery-ui-dragable,我修复了类似于IvánRodríguez的问题,但对touchmove进行了另一个事件覆盖:
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') });
}
};
答案 2 :(得分:2)
这隐藏了消息
jQuery.event.special.touchstart =
{
setup: function( _, ns, handle )
{
if ( ns.includes("noPreventDefault") )
{
this.addEventListener("touchstart", handle, { passive: false });
}
else
{
this.addEventListener("touchstart", handle, { passive: true });
}
}
};
答案 3 :(得分:2)
也在Laravel的select2下拉插件中遇到此问题。根据Alfred Wallace的建议更改值,
this.element.addEventListener(t, e, !1)
到
this.element.addEventListener(t, e, { passive: true} )
解决了问题。为什么他会投反对票,我不知道,但这对我有用。
答案 4 :(得分:2)
我认为除了基于触摸的事件之外,您还可以添加基于滚动的修复程序,以防止谷歌页面分数将其标记为桌面与移动:
// 被动事件监听器(设置标志的两个细微变化)
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 });
}
};
答案 5 :(得分:0)
我找到了适用于jQuery 3.4.1 slim
的解决方案缩小后,将{passive: true}
添加到第1567行的addEventListener函数中,如下所示:
t.addEventListener(p, a, {passive: true}))
没有中断,灯塔审核不会抱怨听众。
答案 6 :(得分:0)
对于那些遗留遗留问题的人,找到抛出错误的行并添加{passive: true}
-例如:
this.element.addEventListener(t, e, !1)
成为
this.element.addEventListener(t, e, { passive: true} )
答案 7 :(得分:0)
以下库解决了该问题。
只需将此代码添加到您的项目中即可。
<script type="text/javascript" src="https://unpkg.com/default-passive-events"></script>
如果您需要更多信息,请访问此library。