its*_*eek 4 javascript ajax jquery 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
})
Run Code Online (Sandbox Code Playgroud)
我没有发布我正在运行的确切代码,因为代码相当复杂.如果发布的代码中存在语法错误,请忽略,因为这些不是我的问题的原因.代码在Firefox中按预期工作,但不是IE或Chrome.另外,我可以在Firebug lite中验证代码运行的顺序不应该导致问题.我要做的是调用Web服务,解析结果并将所需信息存储在全局变量中,以便在以后的函数中使用,我只能在完成DOM加载后调用它们.我在加载文档之前运行setUserFields函数.该函数被调用并设置变量,但变量仅在parseXML()的范围内可用.由于我已经将变量声明在所有函数的范围之外,并且我在parseXML函数中设置了变量,我希望变量可以全局设置.但是,只有在firefox中我可以访问变量而不会定义它们.我对javascript竞技场很陌生,所以我可能会错过一个明显的陷阱.谷歌搜索谷歌几个小时没有任何运气.任何帮助将不胜感激.
这不是范围问题.这可能是由于AJAX调用的异步性质.
Ajax中的第一个字母代表"异步",意味着操作并行发生,并且无法保证完成的顺序.$ .ajax()的async选项默认为true,表示在发出请求后代码执行可以继续.将此选项设置为false(从而使调用不再异步)是强烈建议不要的,因为它可能导致浏览器无响应.