0

我有一个旧代码,它依赖于使用以下 ajax 调用的 JQuery 1.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 为空,最重要的是 ChangeContent 函数正在不同的地方使用并且不在我的控制范围内(它用作外部用户的 API ... ETC)。上面的用法示例如下:

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

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

请注意,doFurtherStuff 必须具有正确的“this”对象值,即 ChangeContent 函数中指定的上下文。当我尝试使用不同的延迟 then() ...等。升级后JQuery 1.8.1 中的函数解决了上述this.callback.call(this.context[0], data);问题,回调函数中的“this”对象具有不同的值,因为我猜新的 JQuery 库处理方式不同。

有没有办法解决上述错误,同时限制对 ChangeContent 函数的更改,因为我试图避免要求所有用户更改他们调用和处理来自该函数的回调的方式?

4

1 回答 1

1

添加 context 选项时,您是在告诉 jQuerythis成功回调中应该包含什么。这意味着您无法访问传递给 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 回答