2009-05-26 46 views
17

Khi tôi sử dụng chức năng fade/slide/animate trong jQuery gọi lại được gọi nhiều lần cho mỗi phần tử mà hiệu ứng được áp dụng cho. Điều này là do thiết kế của khóa học. Tôi chỉ muốn biết khi nào cuộc gọi lại cuối cùng được gọi.gọi lại jquery được gọi nhiều lần

Dưới đây là những gì tôi đưa ra - nó mờ dần tất cả các div và hiển thị cảnh báo() khi cuộc gọi lại cuối cùng được kích hoạt.

$("div").fadeOut(1000, function() 
{ 
    if ($("div").index($(this)) == $("div").length-1) 
      alert("this is the final callback"); 
}); 

Có cách nào đơn giản hơn để kiểm tra xem cuộc gọi lại là cuộc gọi cuối cùng hay đây là cách duy nhất để thực hiện?

Trả lời

17

Điều đó sẽ tạo cảnh báo khi fadeOut trên phần tử cuối cùng được gọi. Điều đó sẽ không nhất thiết phải là fadeOut cuối cùng.

var numDivs = $('div').length; 
$('div').fadeOut(1000, function() { 
    if(--numDivs > 0) return; 
    alert('this is the final fadeout to complete'); 
}); 

Check it out trên JSFiddle

+0

Ahhh, tôi thấy những gì bạn đang nói. Cuộc gọi tốt! – Gromer

+0

vâng, suy nghĩ tốt. Tôi thích các giải pháp khác nữa nhưng điều này đúng 100%. –

+0

Số đếm được xác định ở đâu? –

1
$("div:not(:last)").fadeOut(1000); 
$("div:last").fadeOut(1000, function() { 
    alert("Hey!"); 
}); 
+0

hay, tôi chưa từng sử dụng() trước đây. tốt để biết! –

46

Hãy thử dùng một cái nhìn tại the jQuery documentation for .promise()

này nên làm việc:

$('div').fadeOut(1000).promise().done(function() { 
    alert('all done'); 
}); 

Như thường là, các tài liệu hướng dẫn jQuery về vấn đề này thực sự là mơ hồ. Nhưng tôi không chắc mình có thể làm

+0

TUYỆT VỜI! Tôi đã thử nó ra và nó hoạt động: http://jsfiddle.net/MP26y/ – geon

+1

Vấn đề duy nhất với phương pháp này là nó chờ đợi cho đến khi tất cả các cuộc gọi đã kết thúc. vì vậy nếu bạn có một nút kích hoạt chức năng đó và bấm vào nó nhiều lần nó sẽ không kích hoạt sau khi nó kết thúc hoạt ảnh mỗi lần. nó sẽ mờ đi nhiều lần và sau đó gọi tất cả các chức năng lời hứa sau đó. Vì vậy, trong một số trường hợp, nó không phải là giải pháp tốt nhất. – Rumpleteaser

+0

Bạn cũng có thể muốn kiểm tra phương pháp [jQuery's .finish()] (http://api.jquery.com/?s=finish%28%29), điều này có thể làm giảm bớt các vấn đề về nhấp chuột được đề cập ở trên. – matlembo

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