2009-05-28 26 views
27

Có cách nào để trích xuất url yêu cầu từ đối tượng xhr không? Tôi có thể thấy url trong firebug thông qua thuộc tính kênh nhưng bạn không thể truy vấn bằng javascript.Nhận url yêu cầu từ đối tượng xhr

+0

là này cho một phần mở rộng firefox hoặc cho một kịch bản trên một trang? Nếu nó ở trên trang, tại sao bạn không có thông tin đó? –

+0

Tôi có nhiều khoảng thời gian yêu cầu dữ liệu khác nhau, tôi có một số sự kiện ajaxStart & ajaxComplete phổ biến để xử lý sự kiện chung (hiển thị/ẩn chỉ báo tiến trình). Tôi chỉ cần truy cập vào url cho trường hợp cạnh trong sự kiện ajaxComplete. – redsquare

Trả lời

6

Tôi hy vọng tôi sẽ hiểu chính xác vấn đề của bạn.

Sẽ khá đơn giản để bao bọc các đối tượng XHR của bạn với đối tượng của riêng bạn để cho phép loại chức năng này.

Dưới đây là một ví dụ quá đơn giản:

// Assumption: GetXHR() returns a new XHR object, cross browser. 

function HTTPGet(url, onStartCb, onCompleteCb) 
{ 
    var xhr = GetXHR(); 
    // Construct your own xhr object that contains the url and the xhr object itself. 
    var myXhr = { xhr: xhr, url: url }; 

    xhr.onreadystatechange = function() 
    { 
    if (xhr.readyState == 4 && xhr.status == 200) 
    { 
     onCompleteCb(myXhr); 
    } 
    }; 

    xhr.open("GET", url); 
    onStartCb(myXhr); 
    xhr.send(null); 
} 

tôi đã không kiểm tra này rộng rãi, nhưng nó phải làm việc và với một số sửa đổi (xử lý lỗi, đi qua các thông số, vv), bạn có lẽ nên có thể biến ví dụ này vào một giải pháp đầy đủ chức năng.

+0

vâng đây sẽ là cách tiếp cận tốt nhất. sự cần thiết phải refactor tất cả các js tôi hiện đang làm việc với. Chúc mừng cho câu trả lời – redsquare

+0

Nếu bạn có thể cung cấp một số mã bạn hiện đang sử dụng, bạn có thể tìm ra cách thanh lịch để thêm chức năng này mà không phải sửa đổi mã của mình một cách đáng kể. Nó sẽ có thể khỉ-vá các đối tượng XHR (Tôi đã không thử nghiệm này, tho) bạn đang quay trở lại callbacks của bạn (là bạn?). –

5

Theo https://developer.mozilla.org/en/XmlHttpRequest, bạn thực sự có thể nhận được channel nếu bạn có đặc quyền cao; tuy nhiên, channel là không chuẩn (có thể không hoạt động trong các trình duyệt khác) và thực tế thông số W3C tại http://www.w3.org/TR/XMLHttpRequest/ không đề cập đến channel cũng như cách khác để "trích xuất URL yêu cầu". Tôi nghi ngờ, do đó, không có cách nào để làm như vậy hợp lý trên các trình duyệt.

+0

nhận được thông tin này không phải là một vấn đề cho một phần mở rộng, (vì nó có quyền truy cập đặc quyền) nhưng không có sẵn như tôi biết trong cách sử dụng xmlhttprequest bình thường –

27

Nếu bạn đang sử dụng jQuery, bạn có thể sử dụng chức năng "beforeSend" trong yêu cầu AJAX để sửa đổi đối tượng jqXHR. Ví dụ:

$.ajax({ 
... 
url: "http://some/url", 
beforeSend: function(jqxhr, settings) { jqxhr.requestURL = "http://some/url"; }, 
... 
}); 

Đối tượng jqXHR truyền cho callbacks khác nhau thì sẽ có mà biến, jqXHR.requestURL, mà bạn có thể truy cập.

+4

Nếu bạn thực hiện 'jqxhr.requestURL = settings.url', bạn có thể thiết lập nó trên toàn cầu trong một cuộc gọi' $ .ajaxSetup'. –

15

Với những điều sau đây Hack không wrapper được yêu cầu:

var xhrProto = XMLHttpRequest.prototype, 
    origOpen = xhrProto.open; 

xhrProto.open = function (method, url) { 
    this._url = url; 
    return origOpen.apply(this, arguments); 
}; 

Cách sử dụng:

var r = new XMLHttpRequest(); 
r.open('GET', '...', true); 
alert(r._url); // opens an alert dialog with '...' 
Các vấn đề liên quan