2014-07-14 63 views
0

我用这个功能我每次开酥料饼的时间来创建一个事件:JS - 创建之前删除事件新

var createCustomEvent = function() { 
     var event; 
     if (document.createEvent) { 
      event = document.createEvent("HTMLEvents"); 
      event.initEvent("CUSTOM EVENT", true, true); 
     } else { 
      event = document.createEventObject(); 
      event.eventType = "CUSTOM EVENT"; 
     } 
     event.eventName = "CUSTOM EVENT"; 
     if (document.createEvent) { 
      popover.dispatchEvent(event); 
     } else { 
      popover.fireEvent("on" + event.eventType, event); 
     }  
    }; 

在onother脚本中,我这样做是为了一个事件侦听器添加到节点:

document.removeEventListener('CUSTOM EVENT', handler); 
document.addEventListener('CUSTOM EVENT', handler); 

现在做酥料饼开盘后我有很多CUSTOM EVENTdocument(我用getEventListeners(document)测试)共同创造。 我看到许多CUSTOM EVENT在控制台中使用getEventListeners(文件),所以我认为他们是事件监听器,但我总是删除EventListener之前创建新的,所以也许问题是,我有很多事件而不是事件侦听器,我我不确定。

我怎样才能避免这种情况,并创建总是只有一个CUSTOM EVENT只使用JavaScript?

感谢

+1

我米困惑,你有多个*事件*或多个*事件处理程序*?如果你只想要一个事件处理程序,只需绑定一次。不知道,如果这是相关的,但'document.removeEventListener('CUSTOM EVENT');'是无效的。你必须传递一个你想要移除的处理函数的引用。 –

+0

我编辑过,这是我的错误,但它不是一个相关的问题。顺便说一句,我在控制台中看到很多CUSTOM EVENT使用'getEventListeners(document)',所以它们是_event listeners_,但正如你所看到的,我总是在创建新的之前删除EventListener,所以也许问题是我有很多_events_而不是_event listeners_,我不确定。 – Frank

回答

2

通过documentation让你必须提供处理程序以及removeEventListener工作。

我建议,在createCustomEvent使事件类型的数组,如:

var createCustomEvent = function(elem, event, handler) { 
    if (!elem.events) 
     elem.events = []; 

    if (!elem.events[event]) 
    { 
     elem.events[event] = handler; 

     [your handler attaching here] 
    } 
} 

这样你就可以跟踪事件,并连接到它的处理程序;请记住,上面的代码跟踪一个事件(因为您只能附加一个给定类型的事件)。

+0

感谢这是一个好主意,但我无法将其应用于我自己的案例。 – Frank

+0

@Frank - 如果你可以使用jQuery,它可以通过bind(“click.CUSTOM_EVENT”,function)'/'unbind(“click.CUSTOM_EVENT”)绑定/解除绑定事件。用纯JS做这件事可能会很棘手。 – eithed

0

对不起我的坏,费利克斯·克林是正确的,问题是用:

document.removeEventListener(...); 

不正确的电话是:

document.removeEventListener('CUSTOM EVENT'); 

正确的是:

document.removeEventListener('CUSTOM EVENT', handler);