2012-01-09 10 views
38

Nếu bạn chọn một lớp học hoặc tập hợp các yếu tố để animate với jQuery:

$('.myElems').animate({....}); 

Và sau đó cũng sử dụng chức năng gọi lại, bạn kết thúc với một nhiều cuộc gọi không cần thiết animate().

var i=1; 
$('.myElems').animate({width:'200px'}, 200, function(){ 
    //do something else 
    $('#someOtherElem').animate({opacity:'1'}, 300, function(){   
     if (i>1) console.log('the '+i+'-th waste of resources just finished wasting your resources'); 
     i++; 
    }); 
}); 

Có thể cho rằng đây chỉ là mã xấu và/hoặc thiết kế - nhưng có cái gì tôi có thể làm điều đó cả hai tránh có nhiều animate() cuộc gọi với chỉ một trong số họ sử dụng gọi lại, và có một tải trọng của callbacks không cần thiết thực hiện và vặn vẹo với mã của tôi/hành vi mong đợi? Lý tưởng nhất là tôi chỉ có thể mã một cuộc gọi lại 'dùng một lần' duy nhất sẽ chỉ chạy một lần - nếu không có lẽ đó là một cách hiệu quả để kiểm tra xem một cái gì đó đã được hoạt hình bởi jQuery chưa?

Ví dụ: http://jsfiddle.net/uzSE6/ (cảnh báo - điều này sẽ hiển thị một loạt các hộp cảnh báo).

+0

xác định biến cờ hoặc trên phạm vi tệp hoặc một nơi nào đó có thể truy cập bởi 'animate()'. kiểm tra nó trước khi '$ (" # someOtherElem '). animate() 'gọi và đặt nó trong cơ thể của nó để' $ ("# someOtherElem'). animate()' sẽ không được gọi lần sau. – fardjad

Trả lời

99

Bạn có thể sử dụng when như:

$.when($('.myElems').animate({width: 200}, 200)).then(function() { 
    console.log('foo'); 
}); 

http://jsfiddle.net/tyqZq/

Alterna phiên bản te:

$('.myElems').animate({width: 200}, 200).promise().done(function() { 
    console.log('foo'); 
}); 
+7

Tôi thích điều này. Tôi rất thích điều này. Tôi không biết về các chức năng này, điều này đã giúp rất nhiều :) – jammypeach

+5

+1 Tôi thấy nó khá hữu ích cho '$ ('html, body'). Animate (...)' – Alvaro

2

Bạn có thể tạo một biến để chặn thứ hai + gọi lại ...

var i=1; 
$('.myElems').animate({width:'200px'}, 200, function(){ 
    //do something else 
    $('#someOtherElem').animate({opacity:'1'}, 300, function(){   
     if (i>1) return; 
     else 
     { 
      console.log('the '+i+'-th waste of resources just finished wasting your resources'); 
      i++; 
     } 
    }); 
}); 

này sẽ chỉ bắn một lần như mọi callback tiếp theo sẽ được hủy :)

+3

Tôi sẽ đề nghị sử dụng một tên biến khác với 'i', cái tên thông thường và có thể bị ghi đè vô tình, và đặt nó thành' true' hoặc 'false' thay vì cho rõ ràng. – Blazemonger

+1

^Chắc chắn, nhưng tôi đã sử dụng i vì nó đã có sẵn trong mã ví dụ, tôi chỉ sử dụng nó một chút điều chỉnh. Từ quan điểm của sự rõ ràng một cái gì đó như 'callbackdone' đặt thành giá trị boolean sẽ có ý nghĩa hơn nhiều. – bardiir