Проблема с переменной javascript / jQuery (возможно, проблема с кэшированием) - PullRequest
1 голос
/ 28 декабря 2010

Стандартный AJAX-запрос с jQuery:

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 () через консоль.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 ]

1 голос
/ 28 декабря 2010

Проблема в том, что createpage вызывается синхронно, но функция успеха будет вызываться асинхронно, поэтому нет гарантии, какое глобальное название будет установлено при успешном запуске. Попробуйте сделать globaltitle глобальным для создания страницы вместо всего скрипта.

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);   
        }
    });
}
1 голос
/ 28 декабря 2010

Я бы сделал что-то вроде этого (биты 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
    });

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...