考虑将事件处理程序标记为“被动”,以使页面更具响应性


217

我正在用锤子拖动,加载其他东西时它变得不稳,因为此警告消息告诉我。

由于主线程繁忙,“ touchstart”输入事件的处理延迟了X ms。考虑将事件处理程序标记为“被动”,以使页面更具响应性。

所以我试图像这样向听众添加“被动”

Hammer(element[0]).on("touchstart", function(ev) {
  // stuff
}, {
  passive: true
});

但我仍然收到此警告。

Answers:


264

对于那些初次收到此警告的用户,这是由于最近才在浏览器中实现了称为“ 被动事件侦听器”的最新功能(2016年夏季)。从https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md

被动事件侦听器是DOM规范中的一项新功能,使开发人员可以选择消除滚动而阻塞触摸和滚轮事件侦听器,从而选择更好的滚动性能。开发人员可以使用{passive:true}注释触摸和滚轮侦听器,以表示他们将永远不会调用preventDefault。该功能已在Chrome 51,Firefox 49和WebKit中提供。有关完整的官方说明,请在此处了解更多信息。

另请参阅:什么是被动事件侦听器?

您可能需要等待.js库实现支持。

如果要通过JavaScript库间接处理事件,则可能会受该特定库对功能的支持的支配。截至2019年12月,似乎所有主要图书馆都未实现支持。一些例子:


16
离子库怎么样?
2013年

10
我正在打电话preventDefault()-是否可以禁止显示此警告?
玛雅


12
Google Maps JavaScript API版本3也会生成这些警告。正在issueissueer.google.com/issues/63211698跟踪问题。(具有讽刺意味的是,考虑到Google Chrome浏览器会警告Google Maps JavaScript API会生成违规信息。)
Jochem Schulenklopper

6
要消除此警告,您可以`addEventListener('touchstart',this.callPassedFuntion,{被动:假})`
Shlomi Schwartz

8

这隐藏了警告消息:

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 });
    }
  }
};

5
目标是停止实际事件吗?在处理此问题之前,我不想隐藏该消息。
yardpenalty.com

1
我认为这是一个jQuery库问题。我认为开发人员必须修复它。但是,如果您能得到它,请让我知道如何做。非常感谢。
伊万·罗德里格斯

当然可以,伊万!是的。嘿,现在我很好奇...我正在使用d3插件,并且收到2300次违规。也许您的代码会有所帮助!我会及时向大家发布!
yardpenalty.com

@ yardpenalty.com,不,停止活动不是目标!警告状态表明您已放置侦听器,但未指定是否阻止该事件的默认行为。如果您想致电preventDefault(),请指定passive: false。如果不是,请指定passive: true。如果您未指定任何警告,则只会收到警告。如果您指定passive: truepreventDefault()被调用,它导致一个错误,而不是防止违约。passive在这里指定不是hack。这是解决方案。这就是警告所要的!

@tao感谢您的评论。已经有几年了,但我一定会记得将来的解决方案!
yardpenalty.com

1

在Laravel的select2下拉插件中也会遇到此问题。根据Alfred Wallace的建议更改值

this.element.addEventListener(t, e, !1)

this.element.addEventListener(t, e, { passive: true} )

解决了这个问题。为什么不投票,我不知道,但这对我有用。


0

对于那些遗留遗留问题的人,找到抛出错误的行并添加{passive: true}-例如:

this.element.addEventListener(t, e, !1)

变成

this.element.addEventListener(t, e, { passive: true} )

-1

我找到了适用于jQuery 3.4.1 slim的解决方案

取消缩小后,按如下所示添加{passive: true}到第1567行的addEventListener函数:

t.addEventListener(p, a, {passive: true}))

没有任何休息和灯塔审核不会抱怨听众。


1
永远不要更改库的源代码;您应该改写它。
猛禽
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.