我必须为我的ajax调用(POST)设置自定义请求标头。 由于我在客户端/服务器框架(ZK)后面,我无法掌握整个过程(从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 = 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()",或者在另一个" prototypable" onsomething处理程序?
非常感谢。
答案 0 :(得分: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");
}
};