2010-10-14 27 views
32

Tôi đã thực hiện một số tìm kiếm xung quanh tài liệu và dành một chút thời gian trên mạng nhưng không thể tìm thấy giải pháp cho điều này! Tôi muốn cảnh báo cho tôi biết sự lặp lại của mỗi() nó được bật khi .thumb được nhấp vào.Jquery each() Số lượt truy cập

EG: Có sáu. Tôi nhấp vào số 3, trình duyệt bật lên 3!

Điều gì thực sự xảy ra là bất kể cái nào .thumb được nhấp, 6 bật lên.

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

Mọi trợ giúp đều được biết ơn.

Trả lời

59

Đó là vì bạn đang chia sẻ cùng một biến số counter cho tất cả các trình xử lýclick và mọi thứ kết thúc vào cuối vòng lặp. Thay vào đó, sử dụng một chuyển vào vòng lặp (các tham số chỉ số của .each() đó là đã có), như thế này:

$('.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

Hàm function() là một khai báo hàm ẩn danh. Bạn phải hiểu các hàm LISP hoạt động như thế nào (vâng, ecmascript là lisp).

Thay vì ('ngón tay cái.') $ Mỗi, bạn nên sử dụng một cái gì đó tương tự (chưa được kiểm tra):.

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

Điều này không giải quyết được vấn đề, nó kém hiệu quả hơn nhiều, nhưng cùng một vấn đề của một biến chia sẻ, tất cả chúng sẽ cảnh báo những gì 'i' ở cuối vòng lặp. –

+0

@Nick đúng. Điều này sẽ tạo ra kết quả tương tự như trong câu hỏi. – user113716

+0

Ok, xấu của tôi. Tôi không nên đăng bài này mà không cần kiểm tra. –

0

Để sử dụng một giải pháp như @Paulo gợi ý, bạn sẽ cần phải làm như vậy như thế này:

var list = $('.thumb'); 

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

... mặc dù tôi muốn use @Nicks .each() solution instead. Sạch hơn nhiều.

Các vấn đề liên quan