2014-07-14 121 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);