1

我必须为我的 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.readyState 在执行时仍然等于 1 xhr.setRequestHeader(...)

然而,无论是 Chrome 还是 Firefox,zk_native_function_to_create_a_xhr_OLD()都会返回一个 XMLHttpRequest 对象的实例(具有相同的默认属性)。

两个电话,即。在send()Chrome 和 Firefox 上是异步制作的。最重要的是,当我删除 firebug 上的断点时,我的行xhr.setRequestHeader似乎已到达,因为执行时我在控制台上收到以下错误:

InvalidStateError:尝试使用不可用或不再可用的对象

在我看来,这是因为在调用 xhr.setRequestHeader() 时,xhr.readyState 已经等于 '4'......它的值以生命的速度从 1 变为 4!

我该如何解决这个问题?还是有另一种方法可以调用“xhr.setRequestHeader()”,或者在另一个“原型” onsomething 处理程序中?

非常感谢。

4

1 回答 1

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");
  }
};
于 2013-06-19T16:58:05.643 回答