2011-08-24 30 views
11

Tôi dường như đang quan sát ít nhất một trường hợp trong đó chức năng gọi lại được chuyển đến một hàm hiệu ứng jQuery sẽ thực thi liên tục nếu có lỗi trong khi thực thi.Cuộc gọi lại của jQuery dường như lặp lại do lỗi?

Ví dụ, xem this JS Fiddle, có đoạn mã sau:

$('#awesome').fadeOut(400,function() { 
    log('fading out...'); 
    dieInAFire(); 
}); 

log gắn thêm bất cứ điều gì được truyền cho nó vào một div ... nhưng dieInAFire không tồn tại. Thay vì chỉ dừng thực hiện, tuy nhiên, hàm ẩn danh dường như đang được gọi đi lặp đi lặp lại, được chứng minh bằng số lần xuất hiện ngày càng tăng của 'fading out ...' trong div nhật ký.

Đây có phải là hành vi mong đợi không? Nếu vậy, tại sao?

+0

khám phá tuyệt vời ... :-) Đối với tôi nó không mong đợi gì cả. – HBublitz

+1

Dường như một lỗi jQuery. – Emil

+0

Rất lạ, có vẻ như nó có liên quan đến hoạt ảnh. Gọi lại AJAX không có vấn đề này, và gọi lại này là tốt quá nếu không có hình ảnh động. IE nếu phần tử đã có kiểu 'display: none;' gọi lại được gọi chính xác một lần. Cùng một vấn đề xảy ra với fadeIn() quá – Paulpro

Trả lời

4

Đó là lỗi đã biết. See the report here.

+0

+1 Grrrr, sắp sửa đưa ra một câu trả lời tương tự :) – Krule

+0

Chà, nó cũng cũ rồi. –

+1

Nó đã được sửa ngay bây giờ :) – Paulpro

1

Tôi vừa gửi nhận xét về lỗi mà patrick dw đã đăng.

Thay đổi dòng:

options.complete.call(elem); 

Để:

setTimeout(function(){ 
    options.complete.call(elem); 
}, 0); 

Nguyên nhân gọi lại để thực hiện đồng bộ, và nếu nó sẽ không còn dừng thực hiện nếu nó ném bất kỳ lỗi nào. IMO tốt hơn là sử dụng try catch vì nó không loại trừ ngoại lệ.

Nếu bạn muốn chỉnh sửa phiên bản rút gọn của bạn, và bạn sử dụng jQuery mới nhất, bạn có thể tìm kiếm e.complete.call(d) và thay thế bằng setTimeout(function(){e.complete.call(d)},0)

Các vấn đề liên quan