Làm thế nào để jQuery đợi cho đến khi một hiệu ứng kết thúc?


107

Tôi chắc chắn rằng tôi đã đọc về điều này một ngày khác nhưng dường như tôi không thể tìm thấy nó ở đâu.
Tôi có một fadeOut()sự kiện mà sau đó tôi xóa phần tử, nhưng jQuery đang xóa phần tử trước khi nó có cơ hội hoàn thành việc xóa mờ.
Làm cách nào để khiến jQuery đợi cho đến khi phần tử mờ dần rồi xóa nó?

Câu trả lời:


167

Bạn có thể chỉ định một hàm gọi lại:

$(selector).fadeOut('slow', function() {
    // will be called when the element finishes fading out
    // if selector matches multiple elements it will be called once for each
});

Tài liệu tại đây .


Chơi lô tô. Tôi nghĩ là vậy nhưng những gì tôi cần làm là đặt toàn bộ chức năng của mình vào đó chứ không chỉ phần gỡ bỏ. Tái bút Nếu có ai quan tâm đến cuốn sách tôi đã đọc và bây giờ đã tìm lại được là Học JQuery - Tương tác và Thiết kế tốt hơn. Cảm ơn một lần nữa
uriDium

Nếu ai đó có jQuery cũ, thì lỗi "hoạt ảnh thực hiện gọi lại" này là một lỗi khó chịu: bug.jquery.com/ticket/5684
JustAMartin

178

Với phiên bản jQuery 1.6, bạn có thể sử dụng .promise()phương pháp này.

$(selector).fadeOut('slow');
$(selector).promise().done(function(){
    // will be called when all the animations on the queue finish
});

4
Điều này là thừa đối với hầu hết các hoạt ảnh jQuery vì có các vòng gọi lại trên hầu hết các phương thức, nhưng sử dụng promise()hoặc when()done()bạn có thể tận dụng một số hành vi rất thú vị từ các phương thức của bên thứ ba hoặc thậm chí của chính bạn. +1 để có ý nghĩa .promise()!
stuartc

4
Cái này chưa từng nghe qua, vừa mới cứu mông của ta.
prismspecs

1
trong trường hợp của tôi, tôi đang cố gắng truy cập hoạt ảnh hiện tại của một phần tử đang xảy ra ở một nơi khác trong mã của tôi, và do đó tôi không có quyền truy cập vào lệnh gọi lại của nó. +1
Kristian

11
Sử dụng Promise () cũng cho phép bạn thiết lập một lệnh gọi lại khi mọi thứ đã hoàn tất. Nếu bạn gọi fadeOut () trên một tập hợp 10 điều, sẽ có một lệnh gọi lại cho mỗi điều với 'this' được đặt thành phạm vi thích hợp. Nếu bạn chỉ muốn kích hoạt một lần, chức năng này thực sự hữu ích. Ngoài ra: Nếu bạn tạo hoạt ảnh trên một bộ chọn khớp với 0 phần tử, thì lệnh gọi lại bình thường sẽ không bao giờ kích hoạt. Promise () sẽ hoạt động vào cuối bất kể điều gì.
zslayton

6
Bạn cũng có thể chuỗi nó như thế này:$(selector).fadeOut('slow').promise().done(function(){...});
Syclone

9

Bạn cũng có thể sử dụng $.when()để đợi cho đến khi promisehoàn thành:

var myEvent = function() {
    $( selector ).fadeOut( 'fast' );
};
$.when( myEvent() ).done( function() {
    console.log( 'Task finished.' );
} );

Trong trường hợp bạn đang thực hiện một yêu cầu cũng có thể không thành công, thì bạn thậm chí có thể tiến thêm một bước:

$.when( myEvent() )
    .done( function( d ) {
        console.log( d, 'Task done.' );
    } )
    .fail( function( err ) {
        console.log( err, 'Task failed.' );
    } )
    // Runs always
    .then( function( data, textStatus, jqXHR ) {
        console.log( jqXHR.status, textStatus, 'Status 200/"OK"?' );
    } );

2
Phần này của câu trả lời bằng cách sử dụng $.when()này không hoạt động vì myEvent()không trả lại một lời hứa và $.when()mong bạn chuyển nó một hoặc nhiều lời hứa để nó thực hiện công việc của mình.
jfriend00

6

nếu thứ gì đó bạn muốn chuyển đổi, làm mờ dần một thứ và làm mờ một thứ khác ở cùng một vị trí, bạn có thể đặt thuộc tính {position: secure} trên các div, để cả hai hoạt ảnh chơi chồng lên nhau và bạn không có để đợi một hoạt ảnh kết thúc trước khi bắt đầu hoạt ảnh tiếp theo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.