2010-03-12 41 views
26

Giả sử tôi có một số hoạt ảnh cùng một lúc và tôi muốn gọi hàm sau khi tất cả được hoàn tất.jQuery, gọi lại chỉ một lần sau nhiều hoạt ảnh

Chỉ với một hoạt ảnh, thật dễ dàng; có một cuộc gọi lại cho điều đó. Ví dụ:

$(".myclass").fadeOut(slow,mycallback); 

Sự cố là, nếu bộ chọn của tôi tìm thấy một số mục, gọi lại sẽ được gọi cho từng mục.

Cách giải quyết không quá khó; ví dụ:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Example</title> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js"></script> 
    <script type="text/javascript"> 
    $(document).ready(function() { 
     var $mc=$(".myclass"),l=$mc.length; 
     $mc.fadeOut("slow",function(){ 
     if (! --l) $("#target").append("<p>All done.</p>"); 
     }); 
    }); 
    </script> 
    <style type="text/css"> 
    </style> 
</head> 
<body> 
    <p class="myclass">Paragraph</p> 
    <p class="myclass">Paragraph</p> 
    <p class="myclass">Paragraph</p> 
    <p class="myclass">Paragraph</p> 
    <p class="myclass">Paragraph</p> 
    <p class="myclass">Paragraph</p> 
    <div id="target"></div> 
</body> 
</html> 

Câu hỏi của tôi là: có cách nào tốt hơn để làm điều này không?

+0

Trong hầu hết các trường hợp, tôi sử dụng boolean thay vì bộ đếm (do đó hành động được thực hiện ở cuối hoạt ảnh đầu tiên), nhưng nếu không thì đó là phương pháp tương tự. Câu hỏi hay, tôi tò mò về những cách khác. –

+0

Thật vậy. Bạn muốn chờ tất cả chúng nếu ví dụ tất cả các hoạt ảnh của bạn không cùng độ dài (không giống như trong ví dụ đơn giản của tôi), và bạn chỉ muốn làm điều gì đó sau khi mọi thứ ngừng di chuyển hoặc mờ dần trên trình duyệt của bạn. –

Trả lời

29

Bạn có thể chạy callback tương tự cho tất cả trong số họ, nhưng chỉ thực hiện mệnh đề if nếu không hiện đang được hoạt hình nữa, như thế này:

$(".myclass").fadeOut("slow", function() { 
    if ($(".myclass:animated").length === 0) 
     $("#target").append("<p>All done.</p>"); 
    }); 

này chỉ kiểm tra nếu có vẫn đang được hoạt hình qua :animated selector. Nếu bạn được sinh động rất nhiều thứ khác nhau sau đó sử dụng các khái niệm tương tự, chỉ cần thêm vào bộ chọn như thế này:

$(".myclass:animated, .myClass2:animated") 

Nếu bạn đang sử dụng nó trong rất nhiều nơi, tôi muốn làm cho điều đó gọi lại một hàm onFinish hoặc một cái gì đó để dọn dẹp nó.

+0

Tốt, tôi thích khía cạnh dứt khoát của điều này. –

+0

Tôi cũng thích điều này, +1 –

+0

Cũng gặp sự cố này. Giải pháp thông minh. –

3

Trong trường hợp của tôi, tôi phải xác định

if ($(".myclass:animated").length === 1) 
42

Nhìn vào các cuộc thảo luận về chủ đề này: jQuery $.animate() multiple elements but only fire callback once

Các .when()/.then().promise().done(callback()); chức năng cung cấp một giải pháp nhiều thanh lịch hơn cho vấn đề gọi một đơn calllback ở cuối tất cả các hình động.

+12

Đây phải là câu trả lời đúng. –

+1

Cuộc gọi tốt. Tương tự, điều này sử dụng hàng đợi để kích hoạt một cuộc gọi lại sau khi phần tử cuối cùng được thực hiện aniamting: elements.fadeOut (330) .last(). Queue (function() {}); – Tyler

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