Javascript RemoveEventListener不适用于命名函数
我正在绞尽脑汁寻找Javascript RemoveEventListener不适用于命名函数,javascript,javascript-events,event-handling,Javascript,Javascript Events,Event Handling,我正在绞尽脑汁寻找removeEventListener不起作用的原因。它应该是一次性事件,因此我在回调函数中包含了removeEventListener。但事件每次都会发生 var group = ...//some div's ID var img_button = document.createElement("SPAN"); img_button.setAttribute("id","imgbutton_"+group); if (figures.addEventListener
removeEventListener
不起作用的原因。它应该是一次性事件,因此我在回调函数中包含了removeEventListener
。但事件每次都会发生
var group = ...//some div's ID
var img_button = document.createElement("SPAN");
img_button.setAttribute("id","imgbutton_"+group);
if (figures.addEventListener){
figures.addEventListener(
'click', function(e){if (!e) e = window.event;e.stopPropagation();}, false);
img_button.addEventListener(
'mouseover', loadImg(group), false);
}else{...};
以及回调loadImg
:
function loadImg(nodeId){//loading images when needed
return function(e){
if (!e) e = window.event;
[...]
//remove eventlistener when executed once
var sp = (e.target ? e.target : e.srcElement);
if (sp.removeEventListener){
sp.removeEventListener(
'mouseover', loadImg);
} else {...};
};
匿名函数可以保留,但加载img只需要一次。我忘记了什么?
loadImg
不是侦听器函数的名称。您附加了一个匿名函数,该函数是从loadImg()
返回的
要解决此问题,可以为实际的事件处理程序函数命名:
return function handler (e){
:
this.removeEventListener('mouseover', handler, false);
:
}
此事件处理程序中的
自动引用事件附加到的元素。loadImg
不是侦听器函数的名称。您附加了一个从loadImg()
返回的函数,但该函数没有名称(您可以添加它)。谢谢,蒂姆。我给匿名返回的函数起了个名字,还有tada@埃尔克迈恩,你很好。不完全相关,但看起来您也支持旧的IEs(使用遗留事件处理模型)。如果使用了attachEvent/detachEvent
(推荐),则不必检查event
对象是否存在,它会自动传递。此外,在老年人中也有一些。它们会起作用,但会产生一些副作用,不过要注意,你会给你的处理程序起一个唯一的名字。