队 我希望浏览器从服务器读取属性文件。所以我跟着下面的Jquery / AJaX。
<script>
var properties = null;
$(document).ready(function(){
$.ajax({url:"demo_test.txt",success:function(result){
properties = result;
//properties = $('#result').val()
//jQuery.globalEval("var newVar = result;")
document.write("inside " + properties);
}});
});
document.write("outside " + properties );
</script>
这里“inside”正确打印文件字符。但“外部”是为属性打印null。
我做了一些研究并更新了第四季的答案。
我不知道如何读取属性文件,但我给了xml / json文件读取的解决方案。
更改下面的同步Ajax调用后
var properties = null;
$.ajax({
url : "demo_test.txt",
async : false,
success : function(result)
{
properties = result;
document.write("inside " + properties);
}
});
如果服务器端下面有一个XML文件,那就是解析的方法:
<?xml version="1.0"?>
<server>
<name>velu</name>
</server>
if (window.DOMParser)
{
parser=new DOMParser();
xmlDoc=parser.parseFromString(property,"text/xml");
}
else // Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.loadXML(property);
}
alert(xmlDoc.getElementsByTagName("name")[0].childNodes[0].nodeValue);
如果你在服务器端有json内容,那么
{
"name":velu
}
var obj = JSON.parse(property);
alert(obj.name);
用于访问文件的Javascript样式(Asynchronus)
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{// listener
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
property = xmlhttp.responseText;
}
}
xmlhttp.open("GET","demo_test.txt",true);
xmlhttp.send();
while (property != null) {
alert(property);
break;
}
答案 0 :(得分:4)
您正在使用两种Javascript功能,这些功能以所谓的异步方式运行:onready和AJAX。这意味着您需要设置它们,并且设置后的其余代码将继续运行,直到满足必要的条件来触发事件。单个请求可能需要很长时间才能完成,足以在发出返回之前运行数千行或更多代码。
所以这是你的剧本中发生的事情:
第一行被调用并完成,
var properties = null;
接下来,您告诉您的文档在准备好并完全加载时执行一些代码 :
$(document).ready(function(){...});
你的文档还没有准备好(我们仍然在运行正确的代码领域)所以下一行执行,
document.write("outside " + properties );
properties
仍然为空(尚未调用.ready()
函数内的代码)。
稍后,文档就绪,调用提供的函数,
function(){
$.ajax({url:"demo_test.txt",success:function(result){
properties = result;
document.write("inside " + properties);
}});
在此函数中,您设置一个AJAX请求,该请求在完成时运行一个函数,
$.ajax({url:"demo_test.txt",success:function(result){...}});
此请求也是异步的,因此在处理此请求并从服务器返回时,其余代码将会输出。但是,在此之后,程序中没有其他功能行,所以稍后,该函数将成为下一个调用的函数。
properties = result;
document.write("inside " + properties);
(我已删除评论以便于阅读)
properties
设置为result
,然后打印为非空值。这也解释了为什么你可能首先看到“外部”写入,并且“内部”写入显示第二,即使它出现在“内部”应该首先出现。
处理这种情况的最佳方法是继续返回的AJAX请求中的所有代码,或者让请求调用另一个继续代码的函数。这样你就会知道请求已经处理完毕并且继续安全:
var properties = null;
$.ajax({
url : "demo_test.txt",
success : function(result)
{
properties = result;
document.write("inside " + properties);
runTheRestOfMyCode();
}
});
function runTheRestOfMyCode()
{
document.write("outside " + properties );
}
或者,您可以将jQuery's async
setting in the AJAX request设置为false
。这将使您的代码不会进入下一行,直到发出请求并返回,但它会在等待时暂停所有内容。
var properties = null;
$.ajax({
url : "demo_test.txt",
async : false,
success : function(result)
{
properties = result;
document.write("inside " + properties);
runTheRestOfMyCode();
}
});
document.write("outside " + properties );