2013-08-15 25 views
6

Tôi đang làm việc trên một dự án có một số tập lệnh mà tôi không thể thay đổi. Các tập lệnh này cập nhật trang qua AJAX. Khi cập nhật hoàn tất, tôi cần chạy một số mã.Làm thế nào để chạy một hàm khi bất kỳ XMLHttpRequest nào hoàn thành?

Có sự kiện nào kích hoạt khi mọi XMLHttpRequest hoàn tất không? (hoặc bất kỳ thay đổi trạng thái XMLHttpRequest nào?).

Rất tiếc, tôi không thể truy cập đối tượng XMLHttpRequest cụ thể được sử dụng để thực hiện yêu cầu.

Cảm ơn,

+4

Nếu bạn đang sử dụng jQuery dành riêng cho ajax đã nói, có. ajaxComplete. –

+0

@ Đề xuất của KevinB sẽ chỉ hoạt động nếu các tập lệnh không thuộc quyền kiểm soát của bạn dựa vào jQuery ajax. – Christophe

+0

@Christophe Đó là những gì bình luận của KevinB nói - 'Nếu bạn đang sử dụng jQuery dành riêng cho ** nói ajax **,' – Ian

Trả lời

15

Without jQuery, bạn có thể treo các open phương pháp để đính kèm một người biết lắng nghe cho readystatechange kiện mà từng đối tượng XHR tại thời điểm đối tượng XHR là open ed. Đảm bảo đoạn mã sau chạy trước bất kỳ Ajax xảy ra:

// save the real open 
var oldOpen = XMLHttpRequest.prototype.open; 

function onStateChange(event) { 
    // fires on every readystatechange ever 
    // use `this` to determine which XHR object fired the change event 
} 

XMLHttpRequest.prototype.open = function() { 
    // when an XHR object is opened, add a listener for its readystatechange events 
    this.addEventListener("readystatechange", onStateChange) 

    // run the real `open` 
    oldOpen.apply(this, arguments); 
} 

Ngoài ra, nếu bạn chỉ quan tâm đến thành công load sự kiện, bạn có thể nghe cho sự kiện đó thay vì readystatechange.

+0

Tuyệt vời, hoạt động hoàn hảo! – MCM

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