将事件标记为显式非被动

时间:2017-06-07 07:32:17

标签: javascript google-chrome events

  

[违规]为滚动阻止“wheel”事件添加了非被动事件侦听器。考虑将事件处理程序标记为“被动”以使页面更具响应性。

这个警告有点让我紧张,说实话。我有一个活动,有时我需要拨打preventDefault()

有没有办法将事件标记为显式非被动并摆脱此警告?我知道它不会妨碍执行流程,但这是一个烦恼。我能找到的就是如何将其标记为被动,但它是一个桌面应用程序,它不需要被动标记进行滚动优化。

我不确定当他们将此实现为默认警告时,他们认为是什么让杂乱的控制台变得混乱。我觉得它就像现在EULAS上的同意按钮,不读,只需单击确定,cookie警告,只需单击确定... 我不想解决它,我希望无视它。

enter image description here

2 个答案:

答案 0 :(得分:1)

添加侦听器时指定passive:false:

el.addEventListener('click', someFn, { passive: false });

请参阅:https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener

答案 1 :(得分:1)

上述解决方案有效但需要更改每次调用addEventListener。

如果您希望通过一次更改来影响警告,这些更改会影响您已经用旧格式编写的对addEventListener的所有调用,则可以执行以下操作(从https://stackoverflow.com/a/49292829/3160967修改)。如果您希望它有选择地处理/报告/等等,您可以进一步修改它。

var addEventListener_orig = EventTarget.prototype.addEventListener;
EventTarget.prototype.addEventListener = function(type, handler, opts_orig) {
  var opts;
  if(opts_orig === false || opts_orig === true)
    opts = { capture: opts_orig, passive: false };
  else if(!(opts_orig && opts_orig.constructor == Object))
    opts = { passive: false };
  else
    opts = opts_orig;

  arguments[2] = opts;
  return addEventListener_orig.apply(this, arguments);
};

请注意,由于这会修改基础对象,第三方库可能会采取不同的行为(尽管我无法想到实际可能发生的任何情况,除非3p库也会使用补丁addEventListener,如上所述,如果我'我没有错,只需填写默认值,否则在没有明确提供的情况下使用这些默认值,这样做会使警告消失)