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 creowindow.event
es fácil de comprender como global… pero noevent
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
event
sabes que debe provenir de un ámbito superior (en este casowindow
). Y si lo pasas comoevent
entonces en realidad está accediendo al parámetro y nowindow.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 sievent
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