如何在jQuery.ajax上获得“this.value”

时间:2012-03-30 05:48:41

标签: javascript jquery ajax

我正在使用文本编辑器在FireFox 11上编写javascript。在下面的例子中,“var n = this.val”变为“未定义”。如何在原始类对象中获取本地值?

<html>
<body>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script>
var Test = {
    val : 0,
    begin: function(v){
        this.val = v;
        this.recieve();
    },
    complete: function(o){
        var n = this.val;   // undefined
    },
    recieve : function(){
        $.ajax({
            url : "http://www.yahoo.com/",  // Dummy
            type: "POST",
            dataType: "json",
            complete: this.complete,
            timeout: 1000,
        });
    },
};

var c = Object(Test);
c.begin(10);
</script>
</body>
</html>

3 个答案:

答案 0 :(得分:1)

complete: this.complete. bind(this)

这在旧的IE版本中不起作用,但通过一些努力(添加es5 shim代码),即使在那里也可以使它工作。

complete函数在ajax请求的上下文中执行。如果你写这样的代码:

var method = Test.complete;
method();

this未保留,您只需获取该函数的链接即可。 name1.name2()在js中有一个技巧。 name2不仅应该是name1的属性而且是一个函数,但它(name2)也在name1的上下文中执行。

var x = 'outer', b = {
    x: 'inner',
    a: function() { return this.x; }
};
[(b.a)(), (m = b.a)()] // ["inner", "outer"]

答案 1 :(得分:0)

由于complete是回调,因此范围已更改,this未引用名为Test的对象。您只需将this替换为Test函数中的complete

    var n = Test.val;

=== UPDATE ===

您的问题是“如何获取原始类对象中的本地值?”。我的回答向您展示了如何获取静态对象的字段。

如果您需要共享对象,则应将结构更改为:

function Test() {
    var self = this;
    this.begin = function(v) {
        this.val = v;
        this.recieve();
    }
    this.complete = function(o) {
        var n = this.val;
    }
    this.recieve = function() {
        $.ajax({
            url : "http://www.yahoo.com/",  // Dummy
            type: "POST",
            dataType: "json",
            complete: function(data) {
                self.complete(data);
            },
            timeout: 1000,
        });
    }
}

现在您可以创建两个不同的对象:

var c2 = new Test2;
c2.begin(10);
var d2 = new Test2;
d2.begin(20);

答案 2 :(得分:0)

内部完整处理程序this不是Test。常见的解决方案是为它创建一个代理变量。

recieve : function(){
    var proxy = this;
    $.ajax({
        url : "http://www.yahoo.com/",  // Dummy
        type: "POST",
        dataType: "json",
        complete: function(){
              proxy.complete();
        },
        timeout: 1000,
    });
},

或(在这种情况下)只是Test.val在函数complete

complete: function(o){
    var n = Test.val;   
},