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

Mat*_*att 205 javascript jquery touch angularjs hammer.js

我正在使用锤子进行拖动,并且在加载其他东西时它会变得不稳定,正如此警告消息告诉我的那样.

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

所以我试着像这样向听众添加"被动"

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

但我仍然收到这个警告.

Ans*_*Kao 250

对于那些第一次接收此警告的人来说,这是由于最近(2016年夏天)在浏览器中实现了称为被动事件监听器的前沿功能.来自https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md:

被动事件侦听器是DOM规范中的一项新功能,它使开发人员能够通过无需滚动阻止触摸和轮子事件侦听器来选择更好地滚动性能.开发人员可以使用{passive:true}注释触摸和轮式侦听器,以指示它们永远不会调用preventDefault.此功能在Chrome 51,Firefox 49中提供,并在WebKit中登陆.有关完整的官方解释,请在此处阅

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

您可能必须等待.js库实现支持.

如果您通过JavaScript库间接处理事件,您可能会受到特定库对该功能的支持.截至2016年8月,它似乎没有任何主要图书馆实施支持.一些例子:

  • 离子库怎么样? (14认同)
  • Google Maps JavaScript API版本3也会生成这些警告.正在跟踪问题,网址为https://issuetracker.google.com/issues/63211698.(具有讽刺意味的是,考虑到谷歌浏览器警告谷歌地图JavaScript API生成的违规行为.) (11认同)
  • 我叫`preventDefault()` - 是否有可能抑制这个警告? (9认同)
  • 为了抑制这个警告你可以`addEventListener('touchstart',this.callPassedFuntion,{passive:false})` (5认同)
  • @maja 否 - /sf/ask/3084209201/#44339214 (2认同)
  • @JochemSchulenklopper,yap,具有讽刺意味的是,Google Charts API也提供了这些警告. (2认同)
  • @maja 仅当您未指定“passive”时才会发出警告。默认情况下,浏览器会侦听“preventDefault”,但如果不侦听,这将是一个很大的改进。所以,它会倾听,但它会让你知道:嘿,你可以在这里改进你的应用程序。如果没有,请告诉我你不能(通过声明:`passive: false`)。 (2认同)

小智 27

以下库解决了该问题。
只需将此代码添加到您的项目中即可。

<script type="text/javascript" src="https://unpkg.com/default-passive-events"></script>
Run Code Online (Sandbox Code Playgroud)

如果您需要更多信息,请访问该图书馆


Alf*_*ace 8

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

this.element.addEventListener(t, e, !1)
Run Code Online (Sandbox Code Playgroud)

变成

this.element.addEventListener(t, e, { passive: true} )
Run Code Online (Sandbox Code Playgroud)


And*_*eyP 7

对于带有 jquery-ui-touch-punch 的 jquery-ui-dragable,我修复了它类似于 Iván Rodrí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') });
    }
};
Run Code Online (Sandbox Code Playgroud)


sst*_*ten 7

仅当您未指定时才会发出警告passive

要抑制此警告,您可以:

addEventListener('touchstart', this.callPassedFuntion, { 
  passive: false 
})
Run Code Online (Sandbox Code Playgroud)

默认情况下,浏览器侦听preventDefault. 所以,它会倾听,但它会让你知道:嘿,你可以在这里改进你的应用程序。如果不能,请告诉我你不能(通过说明:)passive: false

我根据已接受答案的评论创建了这个答案,对于任何试图找到这个答案的人来说可能更难找到这个答案。


Ivá*_*uez 5

这隐藏了消息

    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 });
        }
      }
    };
Run Code Online (Sandbox Code Playgroud)

  • 目标是停止实际事件吗?在解决此问题之前,我不想隐藏该消息。 (2认同)
  • @yardpenalty.com,不,停止事件不是目标!该警告表明您已放置侦听器,但未指定它是否会阻止事件的默认行为。如果您想调用“preventDefault()”,则应指定“passive: false”。如果不是,请指定“passive: true”。如果您不指定其中任何一个,您只会收到警告。如果您指定“passive: true”并且调用“preventDefault()”,则会导致错误并且不会阻止默认值。在这里指定“passive”并不是一种黑客行为。这是***解决方案***。这就是警告所要求的! (2认同)

小智 5

在 Laravel 的 select2 下拉插件中也会遇到这个。按照 Alfred Wallace 的建议更改值

this.element.addEventListener(t, e, !1)
Run Code Online (Sandbox Code Playgroud)

this.element.addEventListener(t, e, { passive: true} )
Run Code Online (Sandbox Code Playgroud)

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