2010-01-30 16 views
8

Tôi đang cố gắng thực hiện lệnh div phai vào/ra nằm trong mỗi câu lệnh. Vấn đề là mục tiếp theo được gọi trước khi fade in/out hoàn tất.chờ cho mỗi jQuery

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js" type="text/javascript"></script> 

<div id='one'>one</div> 
<div id='two'>two</div> 
<div id='three'>three</div> 

<script> 
$.each([ "one", "two", "three"], function() { 
    console.log('start - ' + this); 
    animate(this); 
    console.log('end - ' + this); 
}); 

function animate(id) 
{ 
    box = '#' + id; 

    $(box).fadeOut(500, function() 
    { 

    console.log('showing - ' + id); 
    $(box).fadeIn(500); 
    $(box).css('backgroundColor','white'); 

    }); 

} 
</script> 

console lãm -

start - one 
end - one 
start - two 
end - two 
start - three 
end - three 
showing - one 
showing - two 
showing - three 

tôi muốn một cái gì đó giống như -

start - one 
showing - one 
end - one 
start - two 
showing - two 
end - two 
start - three 
showing - three 
end - three 

Vậy làm thế nào tôi có thể chờ đợi nhau từng 'to be hoàn toàn xong trước khi chuyển sang giá trị tiếp theo?

Trả lời

7

Bạn sẽ phải sử dụng gọi lại - chức năng được thực thi khi chức năng hiện tại kết thúc. Để thực hiện việc này với .fadeOut bạn sẽ làm:

$('#element').fadeOut(400, myFunction); 

myFunction sẽ không được gọi cho đến khi hoàn thành. Các cuộc gọi AJAX với $ .get cũng có thể có các chức năng gọi lại.

Dưới đây là một ví dụ mà làm việc, mặc dù tôi chắc chắn rằng có một cách tốt hơn:

function animate(myArray, start_index) { 

    // Stealing this line from Sam, who posted below. 
    if(!start_index) start_index = 0; 

    next_index = start_index+1; 
    if(next_index > myArray.length) { return; } 

    box = '#' + myArray[start_index]; 
    $(box).fadeOut(500, function() { animate(myArray,next_index); }); 
} 

và sau đó trong document.ready của bạn, bạn muốn gọi:

animate(theArray); 
1

Có vẻ như bạn đang cố "chu kỳ" thông qua danh sách các div. Bạn đã xem qua số jQuery Cycle plugin chưa?

+0

tốt, đây chỉ là một ví dụ đơn giản. Tôi có thể muốn thực hiện các cuộc gọi ajax với các giá trị trong mảng, gọi các hàm khác làm những việc khác hoặc một thứ khác. Tôi đã thực hiện những điều sau đây để hiển thị một ví dụ đơn giản về cách để mỗi mục đợi cho mục trước đó hoàn thành. – scott

1

Làm thế nào về điều này, animate bằng cách đi qua từng mục trong mảng trong hàm?

var elements = [ "one", "two", "three"]; 
animate(elements); 

function animate(elements, index) 
{ 
    if(!index) index = 0; 
    var box = '#' + elements[index]; 
    var $$box = $("#box"); 
    console.log('start - ' + elements[index]); 
    $$box.fadeOut(500, function() 
    { 
     console.log('showing - ' + elements[index]); 
     $$box.fadeIn(500, function() { 
      console.log('end - ' + elements[index]); 
      if(elements[++index]) animate(elements, index); 
     }).css('backgroundColor','white'); 
    }); 
} 

Bạn thậm chí có thể lặp lại khi bắt đầu nếu bạn muốn:

var elements = [ "one", "two", "three"]; 
animate(elements); 

function animate(elements, index) 
{ 
    if(!index) index = 0; 
    var box = '#' + elements[index]; 
    var $$box = $(box); 
    console.log('start - ' + elements[index]); 
    $$box.fadeOut(500, function() 
    { 
     console.log('showing - ' + elements[index]); 
     $$box.fadeIn(500, function() { 
      $$box.css('backgroundColor','white'); 
      console.log('end - ' + elements[index]); 
      // go to next element, or first element if at end 
      index = ++index % (elements.length); 
      animate(elements, index); 
     }); 
    }).css('backgroundColor', 'aqua'); 
} 
+0

Đây là câu trả lời hoàn chỉnh hơn cho ví dụ chính xác được đăng sau đó là của tôi; mặc dù trong phòng thủ của tôi, tôi đã cố gắng giữ cho nó một ví dụ đơn giản về đệ quy, như bình luận của tôi ở đây: http://stackoverflow.com/questions/2168485/wait-for-each-jquery – Erik

+0

Yours là một ví dụ đơn giản hơn, và đôi khi có thể mang lại lợi ích (dễ hiểu hơn, phụ thuộc vào những gì bạn muốn làm) – SamWM