javascript / jQuery变量问题(可能是缓存问题)

时间:2010-12-28 05:43:02

标签: javascript jquery ajax

使用jQuery的标准AJAX查询:

var globalTitle = "";
var pages = ["a", "b", "c"];

for (var i = 0; i < pages.length; i++) {
    createpage(pages[i]);
}

function createpage(title) {
    globalTitle=title;
    console.log (globalTitle); //All looks good here

    $.ajax({
        url: "createpage.php?id=" + title,
        context: document.body,
        success: success
    });
}

success()函数使用globaltitle,这就是我必须将其声明为全局的原因。

在success()函数中虽然是console.log(globalTitle);不断给我“一个”。这就像分配了变量,但每次调用success()时都会被缓存。

发生在FF 4和Chrome 8中。有什么想法吗?

编辑:这是success()函数:

function success(text) {
    console.log (globalTitle); // always "a"

    var div1 = "<div id=\"" + globalTitle + "\">";
    var text = "<a href=\"javascript:createpage('" + globalTitle + "')\">Retry</a> " + +text;
    var div2 = "</div>";

    if ($("#" + globalTitle).length) {
        $("#" + globalTitle).html(text);
    } else {
        $("#ajax").append(div1+text+div2);
    }
}

2 个答案:

答案 0 :(得分:1)

我会做这样的事情(var xhr =xhr.cpTitle位是这项工作的关键)。这是因为每次请求页面时都会覆盖globalTitle(在收到任何响应之前都会被覆盖),因此它总是具有最后请求的值:

function createpage(title) {

    console.log(title);

    var xhr = $.ajax({
        method: "post",
        url: "createpage.php",
        data: {
            id: title
        },
        context: document.body,
        success: success
    });

    xhr.cpTitle = title;

}

function success(data, status, xhr) {
    console.log(xhr.cpTitle);
}

或者这个(请注意success() createpage()内的,通过创建闭包以另一种方式避免此问题:

function createpage(title) {

    function success(data, status, xhr) {
        console.log(title);
    }

    console.log(title);

    $.ajax({
        method: "post",
        url: "createpage.php",
        data: {
            id: title
        },
        context: document.body,
        success: success
    });

}

答案 1 :(得分:1)

问题在于同步调用createpage,但是将异步调用success函数,因此无法保证成功运行时将设置globaltitle。尝试将globaltitle global设置为createpage而不是整个脚本。

function createpage(title) {
    $.ajax({
        url: "createpage.php?id=" + title,
        context: document.body,
        success: function(data) {
            console.log(title);

            //you could call your success function here and pass it title
            success(title);   
        }
    });
}