2012-07-11 13 views
15

Desidero aggiungere un ascoltatore esattamente una volta per beforeunload. Questo è il mio pseudocodice:JavaScript: come verificare se l'evento è già stato aggiunto

if(window.hasEventListener('beforeunload') === false) { 
    window.addEventListener('beforeunload', function() { ... }, false); 
} 

Ma hasEventListener non esiste, ovviamente. Come posso raggiungere questo obiettivo? Grazie.

risposta

7

utilizzando jQuery si può fare uso data("events") su qualsiasi oggetto (qui la finestra):

var hasbeforeunload = $(window).data("events") && $(window).data("events").['beforeunload']; 

Ma questo funziona solo per gli eventi jQuery aggiunto.

In un caso più generale, si dovrebbe semplicemente memorizzare le informazioni che si aggiunge un ascoltatore da qualche parte:

var addedListeners = {}; 
    function addWindowListenerIfNone(eventType, fun) { 
     if (addedListeners[eventType]) return; 
     addedListeners[eventType] = fun; 
     window.addEventListener(eventType, fun); 
    } 

penso che ci sia alcun modo standard in javascript per ottenere i gestori di eventi esistenti. Nella migliore delle ipotesi si potrebbe sovrapprezzo la funzione addEventListener del Nodo di intercettare e memorizzare gli ascoltatori, ma io non lo consiglio ...

EDIT:

Da jQuery 1.8, i dati dell'evento sono disponibili nella $._data(element, "events"). Il registro delle modifiche contiene un avviso che dovrebbe essere preso in considerazione:

Si noti che questa non è un'interfaccia pubblica supportata; le strutture effettive dei dati possono cambiare in modo incompatibile da versione a versione.

+0

+1 per la pianura javascript, ma si potrebbe fare cross browser (attachEvent). –

+1

Forse. Questo dovrebbe essere fatto [come spiegato dal MDN] (https://developer.mozilla.org/en/DOM/element.addEventListener#Legacy_Internet_Explorer_and_attachEvent) –

+0

Grazie per il tentativo con jQuery, tuttavia ho bisogno di Javascript nativo, mi dispiace per non menzionare . Comunque andrò con il tuo tentativo di bandiera. Aspetterò ulteriori risposte e, se non migliore, sceglierò il tuo. – Patrick

21

In realtà non v'è alcuna necessità di controllare se un listener è stato aggiunto ad un obiettivo:

Se più EventListeners identici sono registrati sulla stessa EventTarget con gli stessi parametri, le istanze duplicate vengono scartati. Non fanno in modo che EventListener venga chiamato due volte e, poiché i duplicati vengono eliminati, non è necessario rimuoverli manualmente con il metodo removeEventListener.

Fonte

: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget.addEventListener#Multiple_identical_event_listeners

+18

sfortunatamente non è vero. almeno non per il cromo. – ses

+0

Sì, questo non è vero, vedi tu stesso https://jsfiddle.net/rockes/mbd5s1ko/ –

+9

È vero, se in realtà usi lo stesso listener esatto, non solo un listener con lo stesso testo: https:// jsfiddle.net/myxqu27d/ – Atario

Problemi correlati