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