Dom XMLHttp请求-等待实际响应,然后向页面添加文本
从提供的代码开始,我实现了一个上传文件异步函数 问题是一旦调用完成,我就无法检索文本。实际上,我确信文本会返回,因为一旦POST请求完成,它就会显示在firebug控制台中。问题是我的代码没有将其添加到页面中 代码如下: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
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”名称空间