Aquí está mi problema: ¿es posible de alguna manera verificar la existencia de un detector de eventos adjunto dinámicamente? ¿O cómo puedo verificar el estado de la propiedad "onclick" (?) En DOM? He buscado una solución en Internet como Stack Overflow, pero no tuve suerte. Aquí está mi html:
<a id="link1" onclick="linkclick(event)"> link 1 </a>
<a id="link2"> link 2 </a> <!-- without inline onclick handler -->
Luego, en Javascript, adjunto un detector de eventos creado dinámicamente al segundo enlace:
document.getElementById('link2').addEventListener('click', linkclick, false);
El código funciona bien, pero todos mis intentos de detectar ese oyente adjunto fallan:
// test for #link2 - dynamically created eventlistener
alert(elem.onclick); // null
alert(elem.hasAttribute('onclick')); // false
alert(elem.click); // function click(){[native code]} // btw, what's this?
jsFiddle está aquí . Si hace clic en "Agregar al hacer clic para 2" y luego en "[vínculo 2]", el evento se dispara bien, pero el "vínculo de prueba 2" siempre informa falso. ¿Alguien puede ayudar?
Respuestas:
No hay forma de comprobar si existen o no detectores de eventos adjuntos dinámicamente.
La única forma de ver si un detector de eventos está adjunto es adjuntando detectores de eventos como este:
Luego, puede probar si se adjuntó un detector de eventos al
onclick
regresar!!elem.onclick
(o algo similar).fuente
Hice algo como eso:
Crear un atributo especial para un elemento cuando se adjunta un oyente y luego verificar si existe.
fuente
Lo que haría es crear un booleano fuera de su función que comienza como FALSO y se establece en VERDADERO cuando adjunta el evento. Esto le servirá como una especie de bandera antes de adjuntar el evento nuevamente. He aquí un ejemplo de la idea.
fuente
Posible duplicado: compruebe si un elemento tiene un detector de eventos. Sin jQuery Por favor, encuentre mi respuesta allí.
Básicamente, aquí está el truco para el navegador Chromium (Chrome):
fuente
tl; dr : No, no puede hacer esto de ninguna manera compatible de forma nativa.
La única forma que conozco de lograr esto sería crear un objeto de almacenamiento personalizado donde mantenga un registro de los oyentes agregados. Algo en las siguientes líneas:
Paso 1: Primero, necesitará una función que pueda atravesar el objeto de almacenamiento y devolver el registro de un elemento dado el elemento (o falso).
Paso 2: Luego, necesitará una función que pueda agregar un detector de eventos pero también insertar el detector en el objeto de almacenamiento.
Paso 3: en lo que respecta al requisito real de su pregunta, necesitará la siguiente función para verificar si se ha agregado un elemento como detector de eventos para un evento específico.
Paso 4: Finalmente, necesitará una función que pueda eliminar un oyente del objeto de almacenamiento.
Retazo:
Mostrar fragmento de código
Aunque han pasado más de 5 años desde que el OP publicó la pregunta, creo que las personas que se encuentren con ella en el futuro se beneficiarán de esta respuesta, así que siéntase libre de hacer sugerencias o mejoras. 😊
fuente
Siempre puede verificar manualmente si su EventListener existe usando el inspector de Chrome, por ejemplo. En la pestaña Elemento tienes la subpestaña tradicional "Estilos" y cerca de ella otra: "Escuchadores de eventos". Lo que le dará la lista de todos los EventListeners con sus elementos vinculados.
fuente
Parece extraño que este método no exista. ¿Es hora de agregarlo finalmente?
Si quisiera, podría hacer algo como lo siguiente:
fuente
Aquí hay un script que usé para verificar la existencia de un detector de eventos adjunto dinámicamente. Usé jQuery para adjuntar un controlador de eventos a un elemento y luego activar ese evento (en este caso, el evento 'clic'). De esta manera puedo recuperar y capturar propiedades de eventos que solo existirán si el controlador de eventos está adjunto.
fuente
No parece haber una función de navegador cruzado que busque eventos registrados en un elemento determinado.
Sin embargo, es posible ver las funciones de devolución de llamada para elementos en algunos navegadores utilizando sus herramientas de desarrollo. Esto puede resultar útil al intentar determinar cómo funciona una página web o para depurar código.
Firefox
Primero, vea el elemento en la pestaña Inspector dentro de las herramientas de desarrollo. Esto puede hacerse:
Si se registró algún evento en el elemento, verá un botón que contiene la palabra Evento junto al elemento. Al hacer clic en él, podrá ver los eventos que se han registrado con el elemento. Hacer clic en la flecha al lado de un evento le permite ver la función de devolución de llamada correspondiente.
Cromo
Primero, vea el elemento en la pestaña Elementos dentro de las herramientas de desarrollo. Esto puede hacerse:
Cerca de la sección de la ventana que muestra el árbol que contiene los elementos de la página web, debería haber otra sección con una pestaña titulada "Oyentes de eventos". Selecciónelo para ver los eventos que se registraron en el elemento. Para ver el código de un evento determinado, haga clic en el enlace a la derecha.
En Chrome, los eventos para un elemento también se pueden encontrar usando la función getEventListeners . Sin embargo, según mis pruebas, la función getEventListeners no enumera eventos cuando se le pasan varios elementos. Si desea encontrar todos los elementos en la página que tienen oyentes y ver las funciones de devolución de llamada para esos oyentes, puede usar el siguiente código en la consola para hacer esto:
Edite esta respuesta si conoce formas de hacerlo en los navegadores indicados o en otros navegadores.
fuente
Descubrí esto tratando de ver si mi evento estaba adjunto ...
si lo haces :
devolverá "nulo"
pero si lo haces:
entonces es "VERDADERO"
así que creo que cuando usa "addEventListener" para agregar controladores de eventos, la única forma de acceder es a través de "hasOwnProperty". Ojalá supiera por qué o cómo, pero lamentablemente, después de investigar, no he encontrado una explicación.
fuente
onclick
está separado de.addEventListener
- afecta un atributo mientras.addEventListener
que noSi lo entiendo bien, solo puede verificar si se ha verificado un oyente, pero no qué oyente es el presentador específicamente.
Entonces, algún código ad hoc llenaría el vacío para manejar su flujo de codificación. Un método práctico sería crear
state
variables de uso. Por ejemplo, adjunte un verificador de escucha de la siguiente manera:entonces, si establece un oyente, simplemente cambie el valor:
luego dentro de la callback de tu eventListener puedes asignar funcionalidades específicas dentro y de esta misma manera, distribuir el acceso a funcionalidades dependiendo de algún estado como variable por ejemplo:
fuente
Simplemente elimine el evento antes de agregarlo:
fuente
Acabo de escribir un guión que te permite lograrlo. Le brinda dos funciones globales:
hasEvent(Node elm, String event)
ygetEvents(Node elm)
que puede utilizar. Tenga en cuenta que modifica elEventTarget
método de prototipoadd/RemoveEventListener
y no funciona para eventos agregados a través del marcado HTML o la sintaxis de JavaScript deelm.on_event = ...
Más información en GitHub
Demo en vivo
Guión:
fuente
En teoría, podría usar addEventListener y removeEventListener para agregar eliminar una bandera al objeto 'this'. Feo y no he probado ...
fuente