当我在“onStateChange”中检查 (thisRequestStatus == 200) 时,这似乎不仅在图像下载完成时触发,而且在下载一个 URL 的过程中经常触发两次或更多次。 (infoElementCurrentURL 中的文本过早地运行到最后一个 URL。)
我只想触发该代码一次,因此它一次只下载 1 个图像,而不是同时下载两个或更多图像。 (我有一个更长的 URL 列表,尽管这里我只输入了 5 个 URL。)
如何知道使用 nsIWebBrowserPersist 下载何时完成?
Components.utils.import("resource://gre/modules/PrivateBrowsingUtils.jsm");
const WebBrowserPersist = Components
.Constructor("@mozilla.org/embedding/browser/nsWebBrowserPersist;1",
"nsIWebBrowserPersist");
var progressElement = cd.getElementById("id:sp:downloadProgressInfo");
var infoElementCurrentURL = cd.getElementById("id:sp:downloadInfoCurrentURL");
var urlArrayFinal = ["https://farm4.staticflickr.com/3745/13112412145_590436f5f0_o.jpg"
,"https://farm4.staticflickr.com/3799/13112697234_fe0db6aa59_o.jpg"
,"https://farm3.staticflickr.com/2870/13112697464_c401657ec1_o.jpg"
,"https://farm8.staticflickr.com/7005/6582177439_8777d33c95_o.jpg"
,"https://farm8.staticflickr.com/7025/6582206291_853b99e6dc_o.jpg"
,"https://farm8.staticflickr.com/7148/6582203143_d7d627f95a_o.jpg"];
function downloadImage(theURL) {
infoElementCurrentURL.innerHTML = '' + urlArrayFinal.length + ': ' + theURL;
var persist = WebBrowserPersist();
var targetFilePathName = "C:\\\\zttest\\"+theURL.substr(theURL.lastIndexOf('/')+1);
var obj_URI = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService)
.newURI(theURL, null, null);
var targetFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
targetFile.initWithPath(targetFilePathName);
if(!targetFile.exists()) {
targetFile.create(0x00,0644);
}
var privacy = null;
persist.progressListener = {
onProgressChange: function(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress) {
var percentComplete = Math.round((aCurTotalProgress / aMaxTotalProgress) * 100);
progressElement.textContent = '' + percentComplete +"%";
},
onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
try {var httpChannel = aRequest.QueryInterface(Components.interfaces.nsIHttpChannel);
var thisRequestStatus = httpChannel.responseStatus;
var thisRequestLength = httpChannel.getResponseHeader("Content-Length");
} catch(ex) {
}
if (thisRequestStatus == 200) {
progressElement.textContent = thisRequestStatus;
if (urlArrayFinal.length>0) { window.setTimeout(downloadImage(urlArrayFinal.pop(), 100)); }
}
}
}
persist.saveURI(obj_URI, null, null, null, "", targetFile, privacy);
}
if (urlArrayFinal.length>0) { downloadImage(urlArrayFinal.pop()); }
最佳答案
onStateChange
是可行的方法,但是您需要检查 aStateFlags
实际上是 Ci.nsIWebProgressListener.STATE_STOP
.
因此,遵循以下内容即可解决问题:
onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus) {
if (!(aStateFlags & Ci.nsIWebProgressListener.STATE_STOP)) {
// Not done yet
return;
}
if (urlArrayFinal.length>0) {
setTimeout(downloadImage(urlArrayFinal.pop(), 100));
}
}
请注意,检查是否是 HTTP 200 响应是不够的,而且逻辑也不正确。例如。当您收到 404 错误时,下载将停止,而不加载其他图像。
关于javascript - 如何知道 nsIWebBrowserPersist 下载何时完成? (火狐 30、Javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24702436/