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.
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
@ 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. –
Brillante, eso fue todo. Gracias. – EML