Проблемы с переменной областью (JavaScript) - PullRequest
1 голос
/ 05 апреля 2009

У меня есть следующий JavaScript (я использую jQuery):

function language(language)
{
    var text = new Object();

    $.ajax({
        type: "GET",
        url: "includes/xml/languages/" + language + ".xml",
        dataType: "xml",
        success: function(xml){
            $(xml).find('text').each(function(){
                text[$(this).attr('id')] = $(this).text();
            });
        }
    });

    return true;
}

У меня есть XML-файл, который затем читается классом. В XML-файле есть такие объявления:

    <text id="must_be_string">Must be a string.</text>
    <text id="must_be_number">Must be a number.</text>
    <text id="must_be_integer">Must be an integer.</text>

Файл XML читается правильно, но у меня проблема в том, что переменные text не работают должным образом.

Путем установки некоторых предупреждающих точек остановки для отладки я обнаружил, что это именно то, что происходит:

Внутри success: function(xml){, правильный доступ к переменной text. Однако назначение внутри этой функции для назначения новой фразы тексту не добавляет ее правильно. Внутри success: я могу alert(text['must_be_string']) и получить «Должно быть строкой», но когда я покидаю вызов Ajax, он всегда показывает «undefined».

На случай, если мне неясно:

var text = new Object();

$.ajax({
    type: "GET",
    url: "includes/xml/languages/" + language + ".xml",
    dataType: "xml",
    success: function(xml){
        alert(text); // Shows [object Object]
        $(xml).find('text').each(function(){
            text[$(this).attr('id')] = $(this).text();
        });
        alert(text['must_be_string']); // Shows "Must be a string."
    }
});
alert(text['must_be_string']); // Shows undefined -- this is my problem

Я бы очень, очень признателен за любую помощь в этом. Пожалуйста, объясните, потому что я действительно хотел бы понять, что происходит.

Ответы [ 2 ]

7 голосов
/ 05 апреля 2009

Метод успеха вызова ajax - это асинхронный вызов. Когда вы вызываете $.ajax, метод мгновенно возвращается и пытается выполнить alert(text['must_be_string']);, который не будет установлен до тех пор, пока не будет выполнен успешный вызов ajax, какой-то момент в будущем.

Надеюсь, это поможет.

0 голосов
/ 05 апреля 2009

Переменная «текст» живет в рамках функции «язык». Я не уверен, как jQuery управляет областями, но я думаю, что функция успеха - это новая функция, которая не входит в область действия языка.

'language' заканчивается при достижении return и отправляется ajax-запрос. Однако ответ приходит позже (асинхронно).

Попробуйте объявить текстовый объект глобальным, вне языка

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