0

次のajax呼び出しを使用するJQuery1.3.2に依存する古いコードがあります

function ChangeContent(url, somepageobject) {
   var xhrobj = $.ajax({
       url: url,
       context: somepageobject,
       callback: doFurtherStuff,
       success: function(data) {
                somepageobject.html($(data));
                this.callback.call(this.context[0], data, "ok"); // >> Code breaks here
           }
  });
  return xhrobj;
 }

上記のコードの問題は、JQuery 1.8.1にアップグレードしたときにthis.callbackがnullになることです。最も重要なのは、ChangeContent関数がさまざまな場所で使用されており、制御できないことです(外部ユーザーのAPIとして使用されます...等)。上記の使用例は次のようになります。

xhr_object = ChangeContent("/someurl, $("#resultContainer"));

function doFurtherStuff(responseText, statusText, XMLHttpRequest) 
{
   var identifier = '#' + this.id;
   ...
}

doFurtherStuffには、ChangeContent関数で指定されたコンテキストである正しい「this」オブジェクト値が必要であることに注意してください。別の遅延then()...などを使用しようとしたとき。アップグレード後に上記のthis.callback.call(this.context[0], data);問題を解決するためのJQuery1.8.1の関数は、新しいJQueryライブラリが異なる方法で処理するため、コールバック関数の「this」オブジェクトの値が異なります。

すべてのユーザーにその関数からの呼び出しとコールバックの処理方法を変更するように求めないようにするために、ChangeContent関数への変更を制限しながら、上記のエラーを修正する方法はありますか?

4

1 に答える 1

1

thisコンテキストオプションを追加すると、成功コールバック内に何を含めるべきかをjQueryに指示することになります。つまり、ajaxリクエストに渡されたオプションにアクセスすることはできません。を指定しないかcontext、コールバックを手動で渡します。

function ChangeContent(url, somepageobject) {
   var callback = doFurtherStuff;
   var xhrobj = $.ajax({
       url: url,
       context: somepageobject,
       success: function(data) {
                somepageobject.html($(data));
                callback.call(this[0], data, "ok"); // >> Code breaks here
           }
  });
  return xhrobj;
}

更新:代わりにコードをそのまま使用し続ける場合は、コンテキストプロパティの名前を変更するだけです。

function ChangeContent(url, somepageobject) {
   var xhrobj = $.ajax({
       url: url,
       thecontext: somepageobject,
       callback: doFurtherStuff,
       success: function(data) {
                somepageobject.html($(data));
                this.callback.call(this.thecontext[0], data, "ok"); // >> Code breaks here
           }
  });
  return xhrobj;
}
于 2012-09-18T14:58:42.813 に答える