我在JScript / VBScript HTML应用程序上工作(因此我们可以以比普通网页更高的权限执行),并且我们提供下载文件的功能,并且需要向我们的用户提供有关下载进度的反馈。当然,我根据总文件大小和已下载文件的数量计算了进度条或进度文本。我试图在Internet Explorer中获取已下载部分的大小。到目前为止,我已经尝试了所有我能想到的内容来访问已经下载了多少文件。在readyState 3(交互式)期间尝试访问responseText或responseBody时,我只是得到了异常:
尚未提供完成此操作所需的数据。
因此,当他们记录在XMLHttpRequest完成之前(即已进入readyState 4),responseText或responseBody将无法使用时,微软似乎没有撒谎。
我可以得到总文件大小并将文件保存到磁盘,所以我省略了我已经拥有的代码部分。这是我一直在尝试的。我愿意接受任何其他建议 - 甚至改变XMLHttpRequest的实现。请注意,我无法控制服务器端的东西...只有我的客户端应用程序,因此php / ASP解决方案将无法正常工作。 提前谢谢......
function getRemoteFile(urlToFile){
if (urlToFile) {
try {
var xmlReq = new XMLHttpRequest();
//Tried all of the following with no luck
//var xmlReq = new ActiveXObject('Microsoft.XMLHTTP');
//var xmlReq = new ActiveXObject('Msxml2.DOMDocument.3.0');
//var xmlReq = new ActiveXObject("Msxml2.XMLHTTP.3.0");
//var xmlReq = new ActiveXObject("Msxml2.XMLHTTP.6.0");
//var xmlReq =new ActiveXObject("Msxml2.DOMDocument.6.0");
function updateDownloadProgress() {
if (xmlReq.readyState == 3) {
try {
alert(xmlReq.responseText.length);
}
catch (e) {
alert(e.message);
}
window.setTimeout(updateDownloadProgress, 200);
}
}
xmlReq.open("GET", urlToFile, true);
xmlReq.onreadystatechange = function(){
if (xmlReq.readyState == 3) {
updateDownloadProgress();
}
if (xmlReq.readyState == 4) {
alert("done");
}
}
xmlReq.send(null);
} catch(e) {
alert(e.message);
return null;
}
}
}
答案 0 :(得分:1)
您可以使用ondataavailable事件显示IE中的XML文档的下载进度:
var xmlDoc = new ActiveXObject("MSXML2.DOMDocument.3.0");
xmlDoc.ondataavailable = ondataavailable;
xmlDoc.async = true;
xmlDoc.load(url);
function ondataavailable() {
...
}
XML在完全加载之前变得可用。要显示进度,您需要在服务器端的第一个XML节点中放置节点数,并在新的XML到达时计算节点。
我知道这只对XML文档有帮助,而且您必须能够修改服务器xml添加节点数。但据我所知,这是以某种方式显示IE进展的唯一方法。
请注意,如果服务器返回非xml内容,则ondataavailable永远不会触发。
答案 1 :(得分:0)
检查下载进度时添加try / catch块。确保在服务器可用时刷新数据,某些服务器/服务器脚本将缓冲内容。
答案 2 :(得分:0)
我认为你不能直截了当地做到这一点,因为在收到所有内容之前,你不会在客户端获得进度更新(至少不是以整齐的跨浏览器方式)。但是,您可以在服务器端告诉您已将多少文件写入响应。因此,一种方法是通过第二次AJAX调用并行地为特定下载请求写入响应的数量。因此,为每个下载提供一个ID,通过此ID存储可查找的下载状态服务器端,并调用单独的并行AJAX请求来查询该ID的进度。然后以您想要的任何方式显示 - 进度条,显示完成百分比的标签等
有关readyState == 3
周围问题的讨论,请参阅this post。
答案 3 :(得分:0)
迟到总比没有......添加答案......
今天我发现,通过尝试你无法访问'Microsoft.XMLHTTP'的内容 - 并且很可能是所有其他XMLHTTP派生词 - 直到它被完全加载。
但是,您可以在加载时实时访问“internetExplorer.application”的内容。 但我想对于Web开发人员来说,这个目标并不灵活。