如何在客户端浏览器中读取服务器文件

时间:2013-05-23 14:05:32

标签: javascript jquery ajax

队 我希望浏览器从服务器读取属性文件。所以我跟着下面的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。

  1. 为什么?
  2. 我能够在页面上看到“外部”输出;只有我评论“内线”?为什么会这样?
  3. 如何获取jquery结果以进一步处理数据?
  4. 我可以在服务器中有一个属性文件(key = value),jquery / ajax提供的设备类似于java.util.property :: getValue(“key”)吗? 如果以上是不可能的;我可以将属性文件保存为JSON或XML文件以及Ajax提供的任何实用程序来获取密钥的值吗?
  5. 更新

    我做了一些研究并更新了第四季的答案。
    我不知道如何读取属性文件,但我给了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;
    }
    

1 个答案:

答案 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 );