var field1;
var field2;
function setUserFields() {
$.ajax({
type: "POST",
url: "url",
dataType: "xml",
complete: parseXml
});
}
function parseXml {
$(xml.responseXML).find("myValue").each(function()
{
field1 = $(this).attr('attr1');
field2 = $(this).attr('attr2');
alert(field1 + ' ' field2); //shows correct values
});
}
setUserFields();
$(function() {
alert(field1); //undefined in IE and Chrome | Gives correct value in FireFox
alert(field2); //undefined in IE and Chrome | Gives correct value in FireFox
})
Я не отправляю точный код, который я запускаю, так как код довольно сложный. Если в отправленном коде есть синтаксические ошибки, не обращайте внимания, поскольку это не является причиной моей проблемы. Код работает как ожидается в Firefox, но не в IE или Chrome. Кроме того, я могу проверить в Firebug lite, что порядок запуска кода не должен вызывать проблемы. То, что я пытаюсь сделать, это вызвать веб-службу, проанализировать результаты и сохранить необходимую информацию в глобальной переменной для использования в более поздних функциях, которые я могу вызвать только после завершения загрузки DOM. Я запускаю функцию setUserFields до загрузки документа. Функция вызывается и устанавливает переменные, но переменные доступны только в области parseXML(). Поскольку я объявлял переменные за пределами всех функций и устанавливаю переменные внутри функции parseXML, я бы ожидал, что переменные будут установлены глобально. Однако только в firefox я могу получить доступ к переменным без их неопределенности. Я довольно новичок в javascript-арене, поэтому мне может не хватать очевидной ловушки. Я пробовал погулять в течение нескольких часов без везения. Любая помощь будет принята с благодарностью.jQuery/javascript variable scope
+1 Это ** ** проблема синхронизации. Вы не можете полагаться на глобальную переменную, заполненную обратным вызовом успеха, вне этого обратного вызова. –
Да, вам нужно поставить все, что вы делаете, с field1 и field2 внутри полного обратного вызова. – Mark
Установка начального значения переменной и ее проверка могут помочь. Если «alert()» показывает начальное значение, это означает, что область переменной одобрена, только асинхронный вызов веб-службы еще не завершен. – 9000