2012-02-16 18 views
7

Đối với jQuery, sự khác biệt trong kết quả của hai đoạn mã sau đây là gì. Có gì không? Tôi có chính xác rằng cuộc gọi lại và mục thứ hai trong chuỗi được thực thi sau khi hoàn thành hoạt ảnh đầu tiên không?Jquery Chaining vs Callbacks

$(selector).animate({ opacity: 1 }).animate({ opacity: 0.5 }); 

vs

$(selector).animate({ opacity: 1}, function() 
{ 
    $(this).animate({ opacity: 0.5 }); 
}); 

Trong loại (s) về tình hình tôi muốn sử dụng một trong khác không? Tôi sẽ chỉ sử dụng sau này nếu tôi cần phải làm một cái gì đó tinh vi hơn hoặc chuyển sang một bộ chọn khác nhau?

Xin cảm ơn trước.

+0

Cũng giống như đánh giá nhanh, tôi nghĩ rằng đầu tiên sẽ hiệu quả hơn vì bạn không phải bỏ $ (this) làm đối tượng jQuery và sau đó gọi animate trên đó. Bạn có thể chỉ muốn sử dụng tùy chọn thứ hai nếu bạn phải làm những thứ phức tạp hơn. Chỉnh sửa: Tôi thấy bạn không tìm kiếm hiệu quả, tôi sẽ nghĩ rằng cả hai chức năng giống nhau mặc dù kể từ trong trường hợp đầu tiên, animate sẽ phải quay trở lại trước khi cuộc gọi thứ hai được chạy. – kand

+0

jQuery quản lý hoạt ảnh bằng cách xếp hàng chúng để hoạt ảnh thứ hai vẫn sẽ không được thực hiện cho đến khi ảnh đầu tiên kết thúc. Điều này chỉ áp dụng cho hoạt ảnh. Xem ví dụ tại http://api.jquery.com/queue/ – Stefan

+0

@Stefan Tạo ý nghĩa. Những gì bạn nói sẽ áp dụng cho bất cứ điều gì được liệt kê ở đây? [Hiệu ứng jQuery] (http://api.jquery.com/category/effects/) – technoTarek

Trả lời

9

Chúng có hiệu quả giống nhau, vì vậy bạn có thể chỉ sử dụng đầu tiên.

Gọi lại (phiên bản thứ hai) là để chạy bất kỳ mã tùy ý nào không được xếp hàng tự động.

Điều này bao gồm các phương thức jQuery khác như .css() chẳng hạn, nếu không có trong gọi lại, sẽ chạy lâu trước khi hoạt ảnh hoàn tất.

// .animate() is automatically queued 
$(selector).animate({ opacity: 1 }).animate({ opacity: 0.5 }); 

// .css() is not automatically queued, so you'd need a callback 
$(selector).animate({ opacity: 1 }, function() { 
    $(this).css({ opacity: 0.5 }); 
}); 

Nếu không gọi lại ...

// Animation starts ----v 
$(selector).animate({ opacity: 1 }).css({ opacity: 0.5 }); 
// ...but .css() runs immediately-------------^ 
// ...because it isn't automatically added to the queue. 
+1

Giải thích tốt, chỉ là nhìn vào nguồn jQuery và bạn là đúng sir! – Loktar

0

Sự khác biệt duy nhất là thời gian: Việc gọi lại trong ví dụ thứ hai sẽ không được thực hiện cho đến khi animate đầu tiên hoàn thành . Animate chuỗi trong ví dụ đầu tiên sẽ xảy ra ngay lập tức sau khi hoạt hình đầu tiên bắt đầu.

+0

http://jsfiddle.net/loktar/MJmgP/ dường như không phải là trường hợp:? – Loktar

+0

@Rory Tôi ban đầu nghĩ rằng thời gian khác nhau quá, nhưng sau đó tôi đọc điều này trên jQuery.com: Mỗi phần tử có thể có một đến nhiều hàng đợi các hàm được đính kèm với jQuery. Trong hầu hết các ứng dụng, chỉ có một hàng đợi (được gọi là fx) được sử dụng. Hàng đợi cho phép một chuỗi các hành động được gọi trên một phần tử không đồng bộ, mà không làm gián đoạn việc thực hiện chương trình ... Ví dụ: '$ ('# foo'). SlideUp().Khi lệnh này được thực hiện, phần tử bắt đầu hoạt ảnh trượt ngay lập tức, nhưng chuyển tiếp mờ dần được đặt trên hàng đợi fx chỉ được gọi khi chuyển đổi trượt hoàn tất. – technoTarek

+0

@technoTarek điều này rất thú vị, bạn có một liên kết cho những người lười biếng (như bản thân mình) không? – jbabey