¿Es el evento una variable global a la que se puede acceder desde cualquier lugar dentro de la cadena de devolución de llamada?

3 minutos de lectura

avatar de usuario
zanona

Estaba jugando con detectores de eventos con DOM y Javascript y me di cuenta de esto:

function chained(msg) {
    console.log(msg, event);
}

function onClick() {
    chained('the body was clicked');
}

document.body.addEventListener('click', onClick);

Ahora lo gracioso… esto generará:

“se hizo clic en el cuerpo, (MouseEvent)”

Entonces pregunto, ¿por qué? ¿Cómo pasa el objeto de evento sin enviarlo en el chained ¿llamar?

function chained(msg) {
    console.log(msg, namedEventObj); //throw error namedEventObj is not defined
}

function onClick(namedEventObj) {
    console.log(event); //outputs (MouseEvent);
    console.log(nameEventObj); //outputs (MouseEvent);
    chained('the body was clicked');
}

document.body.addEventListener('click', onClick);

Incluso si declaro que el evento obj se pasará en el onClick funcionan como namedEventObj estará disponible solo para onClick pero no a chained función… Tengo esto y esto tiene sentido para mí… pero definitivamente no es el event variable que esté disponible para el chained función.

Alguien sabe porque se comporta asi?

Lo único que se me ocurre es que ese evento es de hecho window.event y está disponible cuando se envía algún evento y Event… pero eso significaría que cualquier elemento podría obtener esa información de evento si se llama al mismo tiempo que el evento cuando se activa.

Estoy usando Chrome 11.0.x

  • Tienes razón (window.event), no sé qué más hay que decir al respecto. Por supuesto, puede acceder a las variables globales desde cualquier lugar (por eso son globales).

    – Félix Kling

    21 de junio de 2011 a las 14:03


  • gracias Felix, estoy de acuerdo, solo creo que es un poco confuso crear esto “atajo” porque cuando usas function(event) está pensando que está enviando eso y no que ya se envió automáticamente y no da la impresión de que se extenderá a través de todas las funciones encadenadas. así que creo window.event es fácil de comprender como global… pero no event que en la mayoría de los casos coincide con el nombre del atributo que pasa, pero eso no se puede hacer ya que todo ya está dentro de la ventana de todos modos… y heredado 🙁 acabo de comprobar que no sucede en Gecko tho, pero persiste para webkit

    – zanona

    21 de junio de 2011 a las 14:14


  • Puede ser confuso. Pero si no hay ningún parámetro o variable en la función actual que se nombra eventsabes que debe provenir de un ámbito superior (en este caso window). Y si lo pasas como evententonces en realidad está accediendo al parámetro y no window.event. Así que simplemente funciona cómo funcionan las funciones 🙂

    – Félix Kling

    21 de junio de 2011 a las 14:20

  • Me estoy acostumbrando ahora :), parece una buena alternativa para la funcionalidad de navegación cruzada, por lo que puede garantizar que también funcionará en versiones anteriores de IE, ¿quizás? gracias por la aclaración aquí Félix. Me sentí loco la primera vez.

    – zanona

    21 de junio de 2011 a las 14:34

  • Con respecto a la compatibilidad entre navegadores: a menudo verá controladores de eventos definidos como function(event) { event = event || window.event;}. esto tomará window.event sólo si event no está definido (que es el caso de los navegadores IE más antiguos). window.event no funciona en Firefox.

    – Félix Kling

    21 de junio de 2011 a las 14:48


avatar de usuario
nathan romano

Se puede acceder al evento actual a través de window.event. solo usando event está accediendo implícitamente window.event.

  • @redgetan ¿Cómo se usa el evento en Firefox?

    – kendotwill

    9 de julio de 2015 a las 12:08

  • Los controladores de eventos @kendotwill recibirán un objeto que es el evento

    – alxndr

    9 de enero de 2016 a las 0:43

  • @redgetan ¡Usted, señor! son un salvavidas.

    – ARRIBA

    3 de julio de 2017 a las 6:38

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad