22

Sólo estaba jugando un poco con los detectores de eventos con DOM y JavaScript, y se dio cuenta de esto:¿es una variable global de evento accesible en cualquier lugar dentro de la cadena de devolución de llamada?

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

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

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

Ahora lo curioso ... esta es la salida:

"se hace clic en el cuerpo, (MouseEvent) "

Luego pregunto, ¿por qué? ¿Cómo pasa el objeto del evento sin enviarlo en la llamada chained?

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 el obj evento que se pasa en la función onClick como namedEventObj lo hará disponible sólo para onClick pero no a chained función ... tengo esto y esto tiene sentido para mí ... pero definitivamente no la variable event para estar disponible para la función chained.

¿Alguien sabe por qué se comporta así?

Lo único que se me ocurre es que el evento es de hecho window.event y está disponible cuando se envían algunos eventos y eventos ... pero eso significa que cualquier elemento puede obtener esa información de evento si se llama al mismo tiempo como el evento cuando se desencadena?

estoy usando Chrome 11.0.xo una versión

+1

[Usted tiene razón ('window.event')] (http://blog.strictly-software.com/2009/10/windowevent-support-cross-browser.html), no sé qué hay más que decir sobre eso. Por supuesto, puede acceder a variables globales desde cualquier lugar (es por eso que son globales). –

+0

gracias Félix, estoy de acuerdo, creo que es un poco confuso crear este _ "acceso directo" _ porque cuando usas 'función (evento)' estás pensando que estás enviando eso y no que ya está enviado automáticamente y no lo haces dar la impresión de que se propagará a través de todas las funciones encadenadas. así que creo que 'window.event' es fácil de entender 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 está ya dentro de la ventana. ..and inherited :(acaba de comprobar que no sucede en Gecko tho, pero persiste para webkit – zanona

+2

Puede ser confuso. Pero si no hay ningún parámetro o variable en la función actual que se llama 'evento', usted sabe que debe vienen de un alcance más alto (en este caso 'window'). Y si lo pasa como' event', entonces en realidad está accediendo al parámetro y no a 'window.event'. Así que funciona cómo funcionan las funciones :) –

Respuesta

25

Uno puede acceder al evento corriente a través window.event. Simplemente usando event está accediendo implícitamente al window.event.

+25

no si está usando firefox :( – redgetan

+2

@redgetan ¿Cómo se usa el evento en firefox? – kendotwill

+0

@kendotwill controladores de eventos se pasará un objeto que es el evento – alxndr

Cuestiones relacionadas