删除事件循环中排队的 Javascript 条消息

Removing queued Javascript messages in the event loop

在Javascript中,如果有事件被触发,相应的回调被添加到Javascript引擎事件循环的消息队列中。是否可以通过 Javascript 代码将其从队列中移除?

请注意,事件的调用频率很高,因此可以在执行任何 Javascript 代码之前将其添加到事件队列中。我没有看到描述说 removeEventListener 实际上是通过消息队列并删除相应的事件;想仔细检查 removeEventListener 是否真的这样做了,并且这种功能在所有 Javascript 引擎中以相同的方式实现。

标准 Javascript 不提供对事件队列的任何直接访问。您可以监听事件(通常使用 .addEventListener() 或通过注册回调,当轮到他们时,该事件将触发并调用您的回调。或者,可以使用 .removeEventListener() 或删除一些监听器通过取消特定操作(如 clearTimeout()),但是,无法直接访问管理事件队列。

您可能必须以某种方式在 VM 中包含本机代码才能做到这一点,而如何做到这一点将是非标准的并且特定于特定 Javascript VM。

如果您真的只想能够轻松地防止回调被多次调用,那么您可以创建一个小存根来为您做到这一点。

function callOnce(fn) {
   var called = false;
   return function() {
      if (!called) {
          called = true;
          return fn.apply(this, arguments);
      }
   }
}


// create a callOnce function stub for myFunction
var cb = callOnce(myFunction);

obj1.addEventListener("click", cb);
obj2.addEventListener("click", cb);
obj3.addEventListener("click", cb);

myFunction 只会在第一个事件调用时被调用一次。之后,它将被定义 cb 时创建的 callOnce 存根阻塞。

是的。可以解除对象与事件的绑定。

  • 如果您使用 addEventListener 附加事件然后使用 removeEventListener 将其删除。

  • 如果你用过jQuery .bind()那么用.unbind()删除它。

  • 如果你用过jQuery .on()那么用.off()删除它。

  • 如果用attachEvent,可以用detachEvent()

  • 如果您使用 onclick 或其他类似函数,则只需将其设置为 null 即可删除它们。

    ex. obj.onclick = null.