XMLHttpRequest:Firefox“setRequestHeader”时出现问题

时间:2013-06-19 15:34:46

标签: javascript ajax firefox xmlhttprequest zk

我必须为我的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处理程序?

非常感谢。

1 个答案:

答案 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");
  }
};