2010-12-16 3 views
4
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

ответ

7

Это не проблема с объемом. Это может быть связано с асинхронностью вызовов AJAX.

Первая буква в Ajax означает «асинхронный», что означает, что операция происходит параллельно и порядок выполнения не гарантируется. Параметр async для $ .ajax() по умолчанию соответствует true, указывая, что код может быть выполнен после запроса . Установка этой опции в false (и, таким образом, вызов длиннее асинхронный) сильно обескуражен, так как это может привести к тому, что браузер перестанет отвечать на запросы.

jQuery.ajax()

+2

+1 Это ** ** проблема синхронизации. Вы не можете полагаться на глобальную переменную, заполненную обратным вызовом успеха, вне этого обратного вызова. –

+1

Да, вам нужно поставить все, что вы делаете, с field1 и field2 внутри полного обратного вызова. – Mark

+0

Установка начального значения переменной и ее проверка могут помочь. Если «alert()» показывает начальное значение, это означает, что область переменной одобрена, только асинхронный вызов веб-службы еще не завершен. – 9000

0

В основном это временные Issue

код Ajax не получает казнены к тому времени вы называете эти переменные

alert(field1); //undefined in IE and Chrome | Gives correct value in FireFox 
alert(field2);/

, чтобы исправить эту проблему сделать AJAX вызов документ. Уже и после этого вы можете предупредить filed1 и field2,

Я очень уверен, что это вопрос времени, связанный с асинхронным характером ajax