jQuery / javascript变量范围

时间:2010-12-16 03:07:52

标签: javascript jquery ajax scope

 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中验证代码运行的顺序不应该导致问题。我要做的是调用Web服务,解析结果并将所需信息存储在全局变量中,以便在以后的函数中使用,我只能在完成DOM加载后调用它们。我在加载文档之前运行setUserFields函数。该函数被调用并设置变量,但变量仅在parseXML()的范围内可用。由于我已经将变量声明在所有函数的范围之外,并且我在parseXML函数中设置了变量,我希望变量可以全局设置。但是,只有在firefox中我可以访问变量而不会定义它们。我对javascript竞技场很陌生,所以我可能会错过一个明显的陷阱。谷歌搜索谷歌几个小时没有任何运气。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:7)

这不是范围问题。这可能是由于AJAX调用的异步性质。

  

Ajax的第一个字母代表   “异步”,意思是说   操作并行发生   完成顺序不保证。   $ .ajax()的async选项默认为   为true,表示代码   执行后可以继续执行   提出要求。设置此选项   为假(从而使呼叫没有   更长的异步)是强烈的   气馁,因为它可以导致   浏览器变得没有反应。

jQuery.ajax()

答案 1 :(得分:0)

这主要是时间问题

在调用这些变量时,你的ajax代码没有被执行

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

修复问题在document.ready中进行ajax调用,之后你可以警告filed1和field2,

由于ajax的异步特性,我非常确定这是时间问题