Javascript XMLHttpRequest:Firefox在“;setRequestHeader";
我必须为我的ajax调用(POST)设置自定义请求头。 由于我使用的是客户机/服务器框架(),所以无法掌握整个过程(从open()到send())。这就是为什么我只能如下设置请求头,覆盖本机“onsomething”函数:Javascript XMLHttpRequest:Firefox在“;setRequestHeader";,javascript,ajax,firefox,xmlhttprequest,zk,Javascript,Ajax,Firefox,Xmlhttprequest,Zk,我必须为我的ajax调用(POST)设置自定义请求头。 由于我使用的是客户机/服务器框架(),所以无法掌握整个过程(从open()到send())。这就是为什么我只能如下设置请求头,覆盖本机“onsomething”函数: var zk_native_function_to_instanciate_a_xhr_OLD = zk_native_function_to_instanciate_a_xhr(); zk_native_function_to_instanciate_a_xhr = fun
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.setRequestHeader(…)
时,xhr.readyState仍然等于1
然而,在Chrome和Firefox中,zk_native_function_to_create_a_xhr_OLD()
返回一个XMLHttpRequest对象的实例(具有相同的默认属性)
Chrome和Firefox上的send()
调用都是异步进行的。
最重要的是,当我删除firebug上的断点时,我的行xhr.setRequestHeader
似乎已到达,因为执行时控制台上出现以下错误:
InvalidStateError:试图使用不可用或不再可用的对象
在我看来,这是因为在调用xhr.setRequestHeader()时,xhr.readyState已经等于“4”。。。它的值以生命的速度从1变为4
我如何解决这个问题?或者有没有其他方法可以调用“xhr.setRequestHeader()”,或者在某个处理程序上调用另一个“PrototyTable”
非常感谢。我最终通过直接重写本机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");
}
};
我最终通过直接重写本机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");
}
};
只需在发送请求之前设置标题。只需在发送请求之前设置标题。