2011-11-24 46 views
5

Tôi có một cái gì đó giống như đoạn mã sauChờ một jQueryanimation để hoàn thành trong vòng lặp for

for(i=0, j=10; i<j ; i++){ 
    $('#an-element-'+i).fadeIn(); 
} 

Làm thế nào để làm cho nó để mỗi lần lặp trong vòng lặp sẽ chỉ bắt đầu khi fadeIn(); hoạt hình đã hoàn thành?

chỉnh sửa --- xin lỗi của tôi xấu, tôi đã không bao gồm các 'i' trong vòng lặp

+0

bạn có thể sử dụng [callback ] (http://api.jquery.com/fadeIn/) – ExpExc

Trả lời

7

for vòng lặp đồng bộ, nhưng hoạt ảnh không đồng bộ. Bạn sẽ cần phải sử dụng đệ quy.

var i = 0, j = 10; 
(function fadeNext() { 
    if (i < j) { 
     $('#an-element-' + i++).fadeIn(fadeNext); 
    } 
})(); 

http://jsfiddle.net/uq9mH/

+0

Cảm ơn, có một vài câu trả lời tương tự nhưng đây là câu trả lời đơn giản nhất. Như bạn nói cho các vòng không phù hợp cho điều này (không sử dụng độ trễ) –

+0

Đoạn mã đó là một vẻ đẹp. – Mattis

0

Theo mã của bạn, vòng lặp của bạn sẽ chỉ mờ dần trong cùng một nguyên tố 10 lần.

Trong mọi trường hợp, những gì bạn cần là đặt cuộc gọi trong khi gọi lại của phương pháp fadeIn: http://api.jquery.com/fadeIn/

Something như thế này nên làm việc (không kiểm tra)

var counter = 10; 
function fadeIn(elem) { 
    $(elem).fadeIn('slow', function(){ 
     if (counter > 0) { 
      fadeIn(elem); //up to you how you figure out which element to fade in 
     } 
    }); 
    counter--; 
} 

//var elem = $('.something'); 
fadeIn(elem); 
0

Bạn có thể thực thi mã sau một hoạt ảnh bằng cách đặt nó vào một hàm được chuyển thành tham số gọi lại:

$("#foo").fadeIn("slow",function() { 
    alert("done"); 
}); 

Nhưng không rõ bạn đang cố gắng làm gì. Bạn có fading cùng một yếu tố 10 lần?

+0

xin lỗi vì sự nhầm lẫn tôi đã điều chỉnh mã một chút. Vấn đề là vòng lặp for không đợi cuộc gọi lại và chỉ tiếp tục. Sử dụng đoạn mã này tất cả các phần tử mờ dần cùng một lúc và sau đó tôi nhận được 10 hộp thông báo cùng một lúc. –

+0

@matthew Xin lỗi, đây không phải là giải pháp đầy đủ cho mười yếu tố, chỉ là một ví dụ về cú pháp gọi lại. Giải pháp đệ quy trong câu trả lời được chấp nhận là tối ưu AFAIK –

0

Hãy thử điều này:

for (i = 0, j = 10; i < j; i++) { 
    $('.try').each(function() { 
     $(this).delay(1000).fadeOut().delay(1000).fadeIn(); 
    }); 
} 

Bạn có thể thay đổi thời hạn thời gian bên trong hàm sự chậm trễ. Here is the jsFiddle.

0

nếu bạn có một sự chậm trễ cố định cho tất cả các mục mà bạn có thể sử dụng dòng mã này:

$(this).fadeIn().delay(2000).fadeOut(); 

thay vì

$(this).fadeIn(); 
Các vấn đề liên quan