【问题标题】:$.Ajax Success Invoke Prototype Function Error [duplicate]$.Ajax 成功调用原型函数错误 [重复]
【发布时间】:2012-10-08 17:23:30
【问题描述】:

可能重复:
$(this) inside of AJAX success not working

我有以下示例代码(JSFiddle 跟随)

AdvancedSearch = function() {
    this.current = 'test';
}

AdvancedSearch.prototype.InitPage = function() {
    var t = this.current;
    this.PrePopulate()

}

AdvancedSearch.prototype.UpdateData= function() {
    alert(this.current);
}

AdvancedSearch.prototype.PrePopulate = function() {
    this.UpdateData();

    $.ajax({
        url: 'http://fiddle.jshell.net/',
        success: function(msg) {
            this.UpdateData();
        }
    });
}

var as = new AdvancedSearch();
as.InitPage();​

我在那里有“http://fiddle.jshell.net”,因此请防止他们网站上出现 Access-Control-Allow-Origin 错误。

执行此代码时,出现以下错误:

Uncaught TypeError: Object # has not method 'UpdateData'

如果你执行JSFiddle,你会发现在调用PrePopulate的时候,它运行函数开头的this.UpdateData()就好了。但是,一旦 Ajax 调用完成,您就会收到错误消息。

对为什么会发生这种情况有任何想法吗?也许我以错误的方式处理这个问题。任何见解都会有所帮助。

这是我的 JSFiddle:http://jsfiddle.net/B4NRY/2/

【问题讨论】:

  • 调用成功回调函数时的this 与您的对象的this 不同。下面的dystroy 可以解决这个非常常见的JavaScript 问题。

标签: javascript ajax


【解决方案1】:

您给 $.ajax 的回调不会以您的 AdvancedSearch 实例作为上下文 (this) 来调用。

解决方案 1(适用于所有类似的回调问题):

AdvancedSearch.prototype.PrePopulate = function() {
    this.UpdateData();
    var that = this; // register the that variable in the closure of the callback
    $.ajax({
        url: 'http://fiddle.jshell.net/',
        success: function(msg) {
            that.UpdateData();
        }
    });
}

解决方案 2(特定于 $.ajax,但非常干净,感谢 Felix):

AdvancedSearch.prototype.PrePopulate = function() {
    this.UpdateData();
    $.ajax({
        url: 'http://fiddle.jshell.net/',
        context: this,
        success: function(msg) {
            this.UpdateData();
        }
    });
}

【讨论】:

  • 嗯,这是一个简单的解决方案。感谢您的快速回复!
  • 您可能想解释一下范围错误的事实,以便发帖人了解原因。
  • 我发现设置context: this 更简单;)
  • @FelixKling +1 我添加了你的建议。
  • 我真的很喜欢上下文:这个建议。非常感谢您的解释。对两者都 +1,我会尽快接受。
猜你喜欢
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
相关资源
最近更新 更多