XMLHttprequest - 等待实际响应,然后向页面添加文本

时间:2013-05-14 08:51:13

标签: dom post xmlhttprequest asyncfileupload

filedrag.js提供的代码开始,我实现了上传文件异步功能。

问题是,一旦完成调用,我就无法检索文本。实际上我确定文本已经返回,因为一旦POST请求完成,它就会显示在firebug控制台中。问题是我的代码没有将它添加到页面中。

以下是代码:

if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
} else {// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}

function showHint(str,action,target,url) {
    xmlhttp.open("POST",url,true);
    xmlhttp.setRequestHeader("enctype","multipart/form-data");
    var fd = new FormData;
    fd.append('filexls', str);
    xmlhttp.send(fd);

   console.log(xmlhttp.status); 
      if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            $('#successup').html(xmlhttp.responseText);
      }
}

我已经完成了一些测试,我认为问题出在代码的最后一部分。如果我将console.log(xmlhttp.status)放在if语句之前,它将返回0(请求结尾处的firebug返回200),而如果我将其放在ifif 1}}没有任何内容出现在控制台中。所以我最好的猜测是问题是false语句在实际请求完成之前运行,因此返回{{1}}。

1 个答案:

答案 0 :(得分:1)

您需要为xmlhttp.onreadystatechange分配一个事件监听器。

在侦听器中,您可以使用xmlhttp.readyState检查新的readyState。 readyState为4表示已完成。然后,您可以访问以下属性:xmlhttp.statusxmlhttp.responseText。您还可以使用xmlhttp.getAllResponseHeaders()或类似xmlhttp.getResponseHeader("Content-Type")

之类的内容来访问标头

如果请求状态为假(使用if(!xmlhttp.status)检查),则请求失败。否则,状态是响应的HTTP状态代码。

你可以这样做:

xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
                $('#successup').html(xmlhttp.responseText);
    }
}

注意:您也可以使用同步xmlhttprequests,但这些会在完成之前阻止整个UI,因此除非在Web worker中完成,否则它并不实用。请参阅documentation at MDN

此外,根据http://blogs.msdn.com/b/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx,建议使用new ActiveXObject("Msxml2.XMLHTTP")。不推荐使用Microsoft.XMLHTTP标识符。请注意,本文来自2006年!

  

“Microsoft”命名空间实际上较旧,仅在MSXML3中实现以获得旧版支持。不幸的是,我们在旧版本上使用了“更好”的名称,但在实例化对象时坚持使用“msxml2”命名空间。