javascript undefined

时间:2009-11-08 12:32:28

标签: javascript

为什么我无法在ajax成功返回时访问render函数?也许我疯了但我以前做过这个。

它告诉我this.render不是函数吗?

DataItem.prototype = {
    display: function () {
        $('body').append(this.name + ": " + this.getData(this.rootData, this.subData) + "<br />");
    },
    getData: function (rootData, subData) {
        $.ajax({
            type: "GET", 
            url: "json/data.js",
            data: "",
            dataType: "json",
            success: function (json){
                this.render(json);
            }
        });
    },
    render: function (json) {
        var res = [];
        for(var i=0, t; t=json.log.entries[i]; i++) {
            var p = t.request.url;
            if (p!=undefined) res.push(p);
        }
        return res.length;
    }
};

3 个答案:

答案 0 :(得分:5)

当您尝试拨打this.render()时,范围已更改。我相信this包含ajax请求对象而不是DataItem对象。

一个简单的解决方案是这样做:

getData: function (rootData, subData) {
    var self = this;
    $.ajax({
        type: "GET", 
        url: "json/data.js",
        data: "",
        dataType: "json",
        success: function (json){
            self.render(json);
        }
    });
},

编辑:我错了,在成功函数中this变量包含ajax请求的选项,但我的解决方案仍然正确。请参阅jQuery文档(http://docs.jquery.com/Ajax/jQuery.ajax#options

中的更多内容

答案 1 :(得分:1)

只需添加@adamse回答。如果要外部化success函数而不是使用匿名函数,可以使用以下内容传递其他参数:

function handleSuccess(json) {
   this.self.render(json);
}

$(function() {
    $.ajax({
        type: "GET", 
        url: "json/data.js",
        data: "",
        dataType: "json",
        // pass an additional parameter to the success callback
        self: this,
        success: handleSuccess
    });
});

答案 2 :(得分:0)

由于下面的代码有效(即打印出“abcd”),我不确定你面临的问题是什么,除非你要分享更多代码。

<script>
    DataItem = function(){};
    DataItem.prototype = {
        display: function () {
            return 'a';
        },
        getData: function () {
            document.write(this.render());
            return this;
        },
        render: function () { return "abcd"; }
    };


    di = new DataItem();
    di.getData();

</script>