代码之家  ›  专栏  ›  技术社区  ›  elchmaen

RemoveEventListener不适用于命名函数

  •  2
  • elchmaen  · 技术社区  · 9 年前

    我在绞尽脑汁地寻找原因 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 我只需要一次。我忘了什么?

    1 回复  |  直到 2 年前
        1
  •  1
  •   Teemu    9 年前

    loadImg 不是侦听器函数的名称。您附加了一个匿名函数,该函数从 loadImg() .

    要解决此问题,可以为实际的事件处理程序函数命名:

    return function handler (e){
                :
        this.removeEventListener('mouseover', handler, false);
                :
    }
    

    A working demo at jsFiddle .

    this in事件处理程序自动引用事件附加到的元素。