Tengo un objeto que tiene métodos. Estos métodos se colocan en el objeto dentro de una función anónima. Se parece a esto:
var t = {};
window.document.addEventListener("keydown", function(e) {
t.scroll = function(x, y) {
window.scrollBy(x, y);
};
t.scrollTo = function(x, y) {
window.scrollTo(x, y);
};
});
(hay mucho más código, pero esto es suficiente para mostrar el problema)
Ahora quiero detener el detector de eventos en algunos casos. Por lo tanto, estoy tratando de hacer un removeEventListener pero no puedo averiguar cómo hacerlo. He leído en otras preguntas que no es posible llamar a removeEventListener en funciones anónimas, pero ¿es este también el caso en esta situación?
Tengo un método creado dentro de la función anónima y, por lo tanto, pensé que era posible. Se ve como esto:
t.disable = function() {
window.document.removeEventListener("keydown", this, false);
}
¿Por qué no puedo hacer esto?
¿Hay alguna otra (buena) forma de hacer esto?
Información adicional; esto solo tiene que funcionar en Safari, de ahí la falta de compatibilidad con IE.
(Elem.setUserData('eventListener', function(e){console.log('Event fired.');}, null);
y luego haga Elem.addEventListener ('event', Elem.getUserData ('eventListener'), false); ... y lo mismo para removeEventListener. Espero que puedas ver esto bien.Respuestas:
Creo que ese es el objetivo de una función anónima, carece de un nombre o una forma de referenciarla.
Si yo fuera usted, simplemente crearía una función con nombre o la pondría en una variable para que tenga una referencia a ella.
A continuación, puede eliminarlo
fuente
this
palabra clave puede resultar confusa. Un buen lugar para leer sobre el tema es quirksmode.org/js/this.htmlthis
refiere al elemento al que se agrega el oyente, no al evento en sí (que sería el parámetroe
). Por tantothis === e.currentTarget
. leer developer.mozilla.org/en-US/docs/Web/API/EventTarget/…si está dentro de la función real, puede usar argumentos.callee como referencia a la función. como en:
EDITAR: Esto no funcionará si está trabajando en modo estricto (
"use strict";
)fuente
button.addEventListener('click', function handler() { this.removeEventListener('click', handler); });
Una versión de la solución de Otto Nascarella que funciona en modo estricto es:
fuente
Puede haber varias funciones anónimas, keydown 1
Advertencia: solo funciona
Chrome Dev Tools
y no se puede usar en el código : enlacefuente
getEventListeners
parece ser parte de las herramientas de desarrollo de Chrome, por lo que en realidad no se puede utilizar para nada más que para depurar.en los navegadores modernos, puede hacer lo siguiente ...
https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Parameters
fuente
Una opción no tan anónima
Desde que recibí comentarios de Andy ( muy bien, pero como con muchos ejemplos, deseaba mostrar una expansión contextual de la idea ), aquí hay una exposición menos complicada :
Esto permite una estructura de función efectivamente anónima, evita el uso de llamadas prácticamente obsoletas y permite una fácil eliminación.
Por cierto : la eliminación del elemento de script inmediatamente después de configurar el oyente es un lindo truco para ocultar el código que uno preferiría que no fuera tan obvio para las miradas indiscretas ( estropearía la sorpresa ;-)
Entonces el método ( más simplemente ) es:
fuente
Esto no es ideal, ya que elimina todo, pero podría funcionar para sus necesidades:
Node.cloneNode ()
fuente
JavaScript : el método addEventListener registra el oyente especificado en EventTarget (Elemento | documento | Ventana) al que se llama.
EventTarget. addEventListener ( event_type , handler_function, Bubbling | Capturing );
Mouse, eventos de teclado Prueba de ejemplo en WebConsole:
El método removeEventListener elimina el detector de eventos registrado previamente con EventTarget.addEventListener ().
Puedo usar
fuente
Para dar un enfoque más actualizado a esto:
fuente
Me he encontrado con el mismo problema y esta fue la mejor solución que pude obtener:
Tenga en cuenta que solo he probado esto para el
window
elemento y para el'mousemove'
evento, por lo que podría haber algunos problemas con este enfoque.fuente
Posiblemente no sea la mejor solución en términos de lo que está pidiendo. Todavía no he determinado un método eficiente para eliminar la función anónima declarada en línea con la invocación del detector de eventos.
Yo personalmente uso una variable para almacenar
<target>
y declarar la función fuera de la invocación del detector de eventos, por ejemplo:const target = document.querySelector('<identifier>');
function myFunc(event) {
function code;
}
target.addEventListener('click', myFunc);
Luego, para eliminar el oyente:
target.removeEventListener('click', myFunc);
No es la principal recomendación que recibirá, pero para eliminar funciones anónimas, la única solución que he encontrado útil es eliminar y luego reemplazar el elemento HTML. Estoy seguro de que debe haber un método JS de vainilla mejor, pero aún no lo he visto.
fuente
Sé que este es un hilo bastante antiguo, pero pensé que podría poner mis dos centavos para aquellos que lo encuentren útil.
El guión (disculpas por los nombres de métodos poco creativos):
Y puedes usarlo así:
fuente
fuente
addEventListener
.