在事件循环中删除排队的javascript消息

时间:2016-04-01 15:38:54

标签: javascript javascript-events event-loop

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

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

2 个答案:

答案 0 :(得分:0)

标准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存根阻止。

答案 1 :(得分:0)

是。它可以解除对象的事件。

  • 如果您使用#include<stdio.h> #define MAX4(a,b,c,d) MAX2(MAX2(a,b),MAX2(c,d)) #define MAX2(a,b) a>b?a:b int a,b,c,d; int main(){ /*printf("Please enter 2 integers - \n"); scanf("%d %d",&a,&b); printf("The maximum number among them is %d\n",MAX2(a,b)); */ printf("Please enter 4 integers - \n"); scanf("%d %d %d %d",&a,&b,&c,&d); printf("The maximum number among them is %d\n",MAX4(a,b,c,d));//,MAX2(a,b),MAX2(c,d)); return 0; } 附加事件,请使用addEventListener将其删除。

  • 如果您使用过jQuery removeEventListener,请使用.bind()将其删除。

  • 如果您使用过jQuery .unbind(),请使用.on()将其删除。

  • 如果您使用.off(),则可以使用attachEvent

  • 如果您使用detachEvent()或其他类似功能,则只需将其设置为null即可将其删除。

      

    离。 obj.onclick = null。