Dom XMLHttp请求-等待实际响应,然后向页面添加文本

Dom XMLHttp请求-等待实际响应,然后向页面添加文本,dom,post,xmlhttprequest,asyncfileupload,Dom,Post,Xmlhttprequest,Asyncfileupload,从提供的代码开始,我实现了一个上传文件异步函数 问题是一旦调用完成,我就无法检索文本。实际上,我确信文本会返回,因为一旦POST请求完成,它就会显示在firebug控制台中。问题是我的代码没有将其添加到页面中 代码如下: if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5

从提供的代码开始,我实现了一个上传文件异步函数

问题是一旦调用完成,我就无法检索文本。实际上,我确信文本会返回,因为一旦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
),而如果我将其放在
If
中,则控制台中不会显示任何内容。因此,我的最佳猜测是,问题在于
if
语句在实际请求完成之前运行,因此它返回
false

您需要将事件侦听器分配给
xmlhttp.onreadystatechange

在侦听器内部,您可以使用
xmlhttp.readyState
检查新的readyState。readyState为
4
表示已完成。然后可以访问以下属性:
xmlhttp.status
xmlhttp.responseText
。您还可以通过使用
xmlhttp.getAllResponseHeaders()
或类似于
xmlhttp.getResponseHeader(“内容类型”)的方式来访问标题

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

你可以做:

xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
                $('#successup').html(xmlhttp.responseText);
    }
}
注意:您也可以使用同步xmlhttprequests,但这些请求在完成之前会阻塞整个UI,因此不太实用,除非在web worker中完成。看

此外,根据,建议使用
新的ActiveXObject(“Msxml2.XMLHTTP”)
Microsoft.XMLHTTP
标识符已弃用。请注意,本文来自2006年

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