2012-07-11 23 views
15

Quiero agregar un oyente exactamente una vez para beforeunload. Este es mi pseudocódigo:JavaScript - cómo comprobar si el evento ya se ha agregado

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

Pero hasEventListener no existe obviamente. ¿Cómo puedo conseguir esto? Gracias.

Respuesta

7

usando jQuery que puede hacer uso data("events") en cualquier objeto (en este caso la ventana):

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

Pero esto sólo funciona para los eventos de jQuery añadido.

En un caso más general, simplemente debe almacenar la información que se agrega un oyente en alguna parte:

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

Creo que hay una manera estándar en javascript para obtener los controladores de eventos existentes. A lo sumo se podría recargo la función addEventListener del Nodo para interceptar y almacenar los oyentes, pero yo no lo recomiendo ...

EDIT:

De jQuery 1.8, están disponibles en $._data(element, "events") datos de eventos. El registro de cambios tiene una advertencia que debe tenerse en cuenta:

Tenga en cuenta que esta no es una interfaz pública compatible; las estructuras de datos reales pueden cambiar de manera incompatible de una versión a otra.

+0

1 de la llanura javascript pero podría hacerlo navegadores (attachEvent). –

+1

Quizás. Esto se haría [como se explica en el MDN] (https://developer.mozilla.org/en/DOM/element.addEventListener#Legacy_Internet_Explorer_and_attachEvent) –

+0

Gracias por el intento con jQuery, sin embargo necesito Javascript nativo, lo siento por no mencionar . Sin embargo, voy con tu intento de bandera. Esperaré más respuestas, y si no es mejor, elegiré la tuya. – Patrick

21

De hecho no es necesario para comprobar si un oyente se añadió a un objetivo:

Si varios EventListeners idénticos están registrados en el mismo EventTarget con los mismos parámetros, los casos duplicados se descartan. No hacen que se llame al EventListener dos veces, y dado que los duplicados se descartan, no es necesario eliminarlos manualmente con el método removeEventListener.

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

+18

desafortunadamente no es verdad. al menos no para Chrome. – ses

+0

Sí, esto no es cierto, compruébalo tú mismo https://jsfiddle.net/rockes/mbd5s1ko/ –

+9

Es cierto, si realmente usas exactamente el mismo oyente, no solo un oyente con el mismo texto: https:// jsfiddle.net/myxqu27d/ – Atario

Cuestiones relacionadas