我的最终目标是从网站下载文件。不幸的是,当您单击按钮时,包含URL的页面会通过JavaScript获取下载URL。因此,我无法从HTML中提取网址。
现在,我点击按钮时使用Chrome应用和chrome.webRequest.onCompleted.addListener
获取网址,然后将该网址传递到chrome.downloads.download
以下载文件。
问题在于这会创建一个无限循环,因为使用URL运行chrome.download
只会再次触发chrome.webRequest
。有人可以帮我解决这个鸡肉或鸡蛋问题吗?这是代码:
manifest.json
{
"name": "Chrome test",
"version": "0.1",
"description": "A download test",
"manifest_version": 2,
"permissions": [
"webRequest", "*://*.theSite.com/",
"downloads"
],
"background": {
"scripts": ["backgroundjs.js"],
"persistent": true
}
}
这里是背景javascript:
backgroundjs.js
chrome.webRequest.onCompleted.addListener(function(details){
var fileurl = details.url;
chrome.downloads.download({
url: fileurl
})
},
{urls: ["*://*.theSite.com/KnownGeneralPathOfFile/*"]});
答案 0 :(得分:1)
有多种方法可以完成您想要做的事情。立即想到的几种不同的方法是:
details
侦听器的webRequest
对象的属性区分您的操作。对于下载,似乎是details.tabId===-1
和details.type==='other'
。因此,当满足这两个条件时,您可能无法开始下载。 保留要从下载中排除的网址列表(再次):
鉴于您正在下载的每个网址只启动了一个webRequest
,您可以选择在找到一次匹配后将URL保留在列表中,或者在第一次匹配后将其删除。如果在第一次匹配后将其删除,则只会阻止当前下载生成的webRequest
再次下载。如果您选择将URL保留在列表中,则不会下载相同的URL两次。就个人而言,我希望您的用户通常更愿意每次会话只下载一次网址。但是,这个选择取决于您,或者可能是您允许用户选择的首选项。
以下是一个扩展程序,它实现了保留要从下载中排除的URL列表。就像在这里一样,每个URL只保留到第一次找到。这将阻止下载webRequest
导致启动另一次下载。如果您只想下载一次网址,请注释掉或删除splice
行。
background.js :
var excludedWebRequestDownloadUrls=[];
chrome.webRequest.onCompleted.addListener(function(details){
let fileUrl = details.url;
let foundIndex = excludedWebRequestDownloadUrls.indexOf(fileUrl);
if(foundIndex>-1){
//Remove the found item (only one webRequest is executed for the download).
// May want to not remove the URL from the list of excluded URLs, as you probably
// only want to download the same URL once, not multiple times.
excludedWebRequestDownloadUrls.splice(foundIndex,1);
//Don't try to download the found URL again.
return;
}
//Remember the URL which we are going to download.
excludedWebRequestDownloadUrls.push(fileUrl);
chrome.downloads.download({
url: fileUrl
});
},{urls: ["*://*.stackoverflow.com/questions/*"]});
的manifest.json :
{
"name": "Chrome test",
"version": "0.1",
"description": "A download test",
"manifest_version": 2,
"permissions": [
"webRequest", "*://*.stackoverflow.com/",
"downloads"
],
"background": {
"scripts": ["background.js"],
"persistent": true
}
}
上述代码已在Chrome和Firefox中进行了测试。