Область переменных jQuery / javascript - PullRequest
4 голосов
/ 16 декабря 2010
 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, поэтому я могу упустить очевидную ловушку.Я несколько часов пытался погуглить, но безуспешно.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

7 голосов
/ 16 декабря 2010

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

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

jQuery.ajax()

0 голосов
/ 16 декабря 2010

В основном это проблема синхронизации

ваш код ajax не выполняется к тому времени, когда вы вызываете эти переменные

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

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

Я очень уверен, что это проблема синхронизации из-за асинхронной природы ajax

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