2010-10-14 17 views
32

que he hecho un poco de búsqueda en torno a la documentación, y pasó un tiempo en la red, pero no puede encontrar una solución a este! Quiero que la alerta me diga en qué iteración de cada() estaba cuando se hace clic en .thumb.Jquery cada uno() Contador

EG: Hay seis de .thumb hago clic en el número 3, el navegador muestra arriba 3!

Lo que en realidad sucede es independientemente de lo que se hace clic en .thumb, 6 aparece.

var counter = 1; 
$('.thumb').each(function() { 
    $(this).click(function() { 
     alert (counter); 
    }); 
    counter++; 
}); 

Cualquier ayuda es recibida con gratitud.

Respuesta

59

Eso es porque estás compartiendo el mismo counter variable para todos los click manipuladores y es lo que termina siendo al final del bucle. En lugar de ello, utilizar la aprobada en el bucle (el parámetro de índice de la .each() que ya existe), así:

$('.thumb').each(function (i) { 
    $(this).click(function() { 
     alert (i+1); //index starts with 0, so add 1 if you want 1 first 
    }); 
}); 

You can test it here.

0

La función() es una declaración de la función anónima. Debes entender cómo funcionan las funciones LISP (sí, ecmascript es lisp).

En lugar de $ ('pulgar.') Cada una, que deben tener algo como (no probado):.

var list = $('.thumb'); 
for(var i=0; i<list.length; i++) { 
    $(list[i]).click(function(){ 
     alert(i); 
    }); 
} 
+1

Esto no resuelve el problema, que es mucho menos eficiente, pero el mismo problema de una variable compartida, todos ellos se lo alerta 'I' fue al final del bucle. –

+0

@Nick tiene razón. Esto produciría el mismo resultado que en la pregunta. – user113716

+0

Ok, mi mal. No debería publicar esto sin probarlo. –

0

Para utilizar una solución como @Paulo sugirió, que tendría que hacerlo de esta manera:

var list = $('.thumb'); 

for(var i=0; i<list.length; i++) { 
    (function(i_local) { 
     list.eq(i).click(function(){ 
      alert(i_local); 
     }); 
    })(i + 1); 
}​ 

... aunque tendría use @Nicks .each() solution instead. Mucho más limpio.