Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript XMLHttpRequest:Firefox在“;setRequestHeader";_Javascript_Ajax_Firefox_Xmlhttprequest_Zk - Fatal编程技术网

Javascript XMLHttpRequest:Firefox在“;setRequestHeader";

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

我必须为我的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 = 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");
  }
};

只需在发送请求之前设置标题。只需在发送请求之前设置标题。