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
对象是否存在,它会自动传递。此外,在老年人中也有一些。它们会起作用,但会产生一些副作用,不过要注意,你会给你的处理程序起一个唯一的名字。