2012-01-03 6 views
8

Este me está volviendo loco ... Tengo un bucle que agrega un detector de eventos a un objeto SVG. El objeto es, en aras de la argumentación, un círculo pequeño, y tengo que agregar eventos mouseover y mouseout para cada uno de los 10 círculos.No se puede pasar el evento a addEventListener: cierre el problema

Mi primer problema es el alcance de cierre estándar, ya que todos los oyentes se agregan en el mismo bucle, todos ven el mismo valor no válido de la variable de bucle. Puedo arreglar esto, creo, pero el segundo problema es que tengo que pasar 'evento' a los oyentes, y no puedo encontrar ninguna manera de solucionar estos dos problemas simultáneamente.

He probado varias versiones de esta:

for(month = 0; month < nMonths; month++) { 
    ... 
    shape.addEventListener(
    "mouseover", 
    (function(event, index) { popup_on(event, foo, index); })(event, month), 
    false); 
    group.appendChild(shape); 
} 

Esta versión en particular me da 'caso no está definido'. popup_on es el controlador real, y debe obtener event y el valor actual de month. ¿Alguna idea de cómo debería estar haciendo esto? Gracias.

Respuesta

15

El evento se pasará a su función automáticamente -solo conviértalo en el primer argumento de la función que pasa al addEventListener. Además, false es el valor predeterminado para el parámetro de captura.

(function() { 
    var i = month; 
    shape.addEventListener("mouseover", function(e) { popup_on(e, foo, i); }); 
})(); 

Además, ¿estás bien con foo ser cerrado otra vez en su devolución de llamada de eventos? Si no, usted podría hacer lo mismo con él

(function() { 
    var i = month; 
    var f = foo; 
    shape.addEventListener("mouseover", function(e) { popup_on(e, f, i); }); 
})(); 

Y si todas estas variables locales son cada vez más molesto, puede hacer que los parámetros para hacer posiblemente las cosas un poco más ordenado

(function(i, f) { 
    shape.addEventListener("mouseover", function(e) { popup_on(e, f, i); }); 
})(month, foo); 
+0

Siento ser tan tonto, pero ¿dónde pongo realmente esta función? 'forma' se crea en un bucle, tal vez 10 o 20 veces más, y cada nueva instancia de 'forma' (de 'createElementNS') tiene que tener un controlador asociado. ¿Entonces no parece haber ningún lugar donde pueda poner esta función anónima donde la 'forma' actual está en contexto? Dado esto, ¿no tengo que poner todo en la llamada 'addEventListener'? Lo cual, creo, deja el problema de cómo puedo obtener 'e' y 'mes' como params ...? – EML

+0

@ user785194 Creo que el código que puse arriba funcionará bien. Cada vez que se recrea la forma, simplemente coloque el código de arriba para agregar el detector de eventos a esa instancia particular. –

+0

Brillante, eso fue todo. Gracias. – EML

Cuestiones relacionadas