saber酱的抱枕

生于忧患,死于安乐

06/8
08:00
学习

JavaScript中注册和移除事件

以click事件为例,我们常用onclick和addEventListener来添加它。但是有添加就要有解除,下面先以绑定一个非匿名函数为例:

function test () {
	console.log("yyy");
}
a.onclick=test;
a.addEventListener("click", test, false);

事件函数test是有名字的。如果是无名字的函数,如下:

a.onclick=function(){
	console.log("yyy");
}
a.addEventListener("click", function(){
	console.log("yyy");
}, false);

添加的时候,不管事件函数有没有名字,在效果上是一样的。
添加的时候要注意:
1.onclick和addEventListener添加同一类型的事件是不会互相覆盖的。所以在上面任意一个例子中,都会输出两次"yyy"。
2.如果同一元素存在多个onclick,或同一元素用多个addEventListener添加了同一事件,都是后面添加的事件覆盖前面添加的事件。当然,onclick和addEventListener还是不会互相覆盖的。

但说到移除事件,则有点坑。

1.对于onclick添加的事件,不管它的事件函数时有名字的还是无名字的,都可以将onclick事件设置为空来移除。如:

a.onclick=null;

2.对于addEventListener添加的事件,则比较坑。如果事件函数是有名字的,我们可以用removeEventListener来移除,如:

a.removeEventListener("click", test , false);

但如果事件函数是没有名字的,则无法移除。

虽然可能有一些变通的方法——如在函数外设立一个状态指示器,在每次执行函数时都进行判断,如果状态变成某个值,则不执行函数,就达到了不让函数生效的目的。但是在根源上,这个事件还是没有移除。

综上,当我们需要使用removeEventListener来移除事件的话,方法只能是给函数起个名字了。

JavaScript中注册和移除事件