从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
),而如果我将其放在if
内if
1}}没有任何内容出现在控制台中。所以我最好的猜测是问题是false
语句在实际请求完成之前运行,因此返回{{1}}。
答案 0 :(得分:1)
您需要为xmlhttp.onreadystatechange
分配一个事件监听器。
在侦听器中,您可以使用xmlhttp.readyState
检查新的readyState。 readyState为4
表示已完成。然后,您可以访问以下属性:xmlhttp.status
,xmlhttp.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”命名空间。