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」行にブレークポイントを配置したときにのみ、ready 状態 4 になることです。Chrome を使用すると、ブレークポイントはxhr.readyState'1' ( xhr.OPENED) で正常に停止し、実行時に xhr.readyState は 1 のままですxhr.setRequestHeader(...)

それでも、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()」を呼び出すことができる別の方法、または何かのハンドラーで別の「プロトタイプ化可能な」方法がありますか?

どうもありがとう。

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 に答える