Ver Mensaje Individual
  #5 (permalink)  
Antiguo 20/12/2011, 14:43
Avatar de zerokilled
zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Problema con addEventListener

Cita:
Esto que sigue no funciona porque según pude averiguar, al pasar parámetros para una función usada en addEventListener, estos deben ser variables globales, por lo que no se puede pasar parámetros generados por el bucle en una función (ya que son variables locales).
el problema se debe a otro factor. no lo había previsto porque no había analizado todo el código. no es porque las variables sean locales, que de hecho el evento las ve porque la función anónima esta declarada en el mismo scope donde estan las variables. lo que significa que la función anónima puede acceder a ella. el problema fue que al momento de crear el evento, la función no retiene el valor de la variable de esa iteración. es decir, en este caso particular, la variable $k es el iterador del bucle for. como el valor de $k es mutado, al iniciarse el evento la función lo que ve es el último valor asignado a $k. por tanto, todos los eventos creados en el bucle for accesan al mismo elemento de la colección $links cuando el evento se dispara.

soluciones, para tu caso particular hay varias. una de ella es la delegación de evento. consiste en registrar un solo evento para todos los elementos de interes. si interesa, te recomiendo buscar sobre el tema. busca por palabras claves como javascript delegacion evento. gestion de eventos vs delegacion de evento

otra solución, consiste en crear closure para que el valor de la variable se retenga. la posibilidad se da gracias a que el valor iterable se pasa a un scope distinto donde cada evento tendrá su propio scope. en el siguiente artículo, lee la sección "the infamous loop problem", explaining javascript scope and closures. te lo recomiendo ya que este refleja el problema que estabas teniendo.

finalmente, tu solución es otra posibilidad. eventualmente, this hace referencia al elemento donde se ha asignado el evento. sin embargo, tengo entendido que según el estandar no debería ser así. si bien recuerdo, this dentro de addEventListener debería hacer referencia a otro objeto. en todo caso, no tengo la información a la mano. lo cierto es que todos los navegadores -al menos en lo que he probado- this hace referencia al elemento. por lo que tu solución no esta mal, y de hecho, de todas para mi sería la más sencilla de implementar.

valga todo este rollo para que puedas comprender el problema inicial y algunas de las posibles soluciones. me dejo en el tintero otra posibilidad porque creo que ya es mucho.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 20/12/2011 a las 14:49