2013-06-19 29 views
1

我必須爲我的ajax調用(POST)設置自定義請求標頭。由於我在客戶/服務器框架(ZK)背後,我無法掌握整個過程(從open()到send())。這就是爲什麼我只能設置請求頭如下,覆蓋本地的「onsomething」功能:XMLHttpRequest:Firefox問題「setRequestHeader」

var zk_native_function_to_instanciate_a_xhr_OLD = zk_native_function_to_instanciate_a_xhr(); 
zk_native_function_to_instanciate_a_xhr = function() { 
    var xhr = zk_native_function_to_instanciate_a_xhr_OLD(); 
    xhr.onloadstart = function() { 
     if (xhr.readyState === 1) { 
     xhr.setRequestHeader("XX-MY-CUSTOM-HEADER", "foobarhimself"); 
     } 
    } 
}; 

這工作得非常好使用Chrome,但不會在Firefox在所有的工作。 關鍵是使用Firefox時,我只在'if'行放置斷點時才準備好狀態4。使用Chrome,我的斷點與xhr.readyState等於「1」(xhr.OPENED)成功地停止,xhr.readyState執行xhr.setRequestHeader(...)時仍然等於1。

然而,無論是使用Chrome還是Firefox,zk_native_function_to_create_a_xhr_OLD()都會返回一個XMLHttpRequest對象(具有相同的默認屬性)的實例。

這兩個調用,即。 Chrome和Firefox上的send()是異步製作的。 更有甚者,當我取消對螢火蟲的斷點,我行xhr.setRequestHeader似乎是因爲在執行時我得到控制檯下面的錯誤要達到:

InvalidStateError:試圖使用一個對象,是不是,或不再可用

在我看來,這是因爲在調用xhr.setRequestHeader()時,xhr.readyState已經等於'4'...它的值從1變爲4,速度爲生活!

我該如何解決這個問題?還是有另一種方法,我可以叫「xhr.setRequestHeader()」,或者在另一個「prototypable」 onsomething處理?

非常感謝。

+0

剛剛成立的頭之前發送請求。 – Musa

回答

1

我終於通過直接覆蓋本地open()函數,它發生在嵌入式框架被稱爲解決這個問題。

var zk_native_function_to_instanciate_a_xhr_OLD = zk_native_function_to_instanciate_a_xhr(); 
zk_native_function_to_instanciate_a_xhr = function() { 
    var xhr = zk_native_function_to_instanciate_a_xhr_OLD(); 
    var xhr_open_base = xhr.open; 
    // native XmlHttpRequest.open() signature from XmlHttpRequest API 
    xhr.open = function (method, url, async, user, password) { 
    xhr_open_base.apply(this, arguments); 
    xhr.setRequestHeader("XX-MY-CUSTOM-HEADER", "foobarhimself"); 
    } 
};