我正在编写一个扩展程序,可以检测来自 Coursera 页面的视频请求,如果检测到,则在单击浏览器操作图标时下载它。
打开后
https://www.coursera.org/learn/human-computer-interaction/lecture/pE6EB/human-computer-interaction
我使用chrome.webRequest.onBeforeRequest
来检测视频URL,如果检测到,将其分配给targetUrl
。例如,由于它可能会同时打开许多 Coursera 页面,因此您可以打开此链接
https://www.coursera.org/learn/human-computer-interaction/lecture/25EPu/the-power-of-prototyping
在您打开最后一个页面后,targetUrl
很可能是该页面的视频 URL,而不是最后一个页面。为了使 targetUrl
特定于每个 Coursera 页面,我将使用字典数据类型来存储选项卡特定变量,键应该是选项卡唯一属性,值是相应页面的视频 url .
我面临的困难是我不知道如何以及何时创建 key ,有什么帮助吗?
在为 targetUrl
赋值后创建 key 似乎是合适的,我使用 chrome.tabs.getCurrent(functioncallback)
来获取那里的选项卡属性(注释代码在 background.js
中),但我刚刚得到了 undefined object ,任何人都可以解释为什么吗?
下面是代码
list .json
{
"manifest_version": 2,
"name": "Coursera",
"version": "1.0",
"minimum_chrome_version": "31",
"browser_action": {
"default_icon": "video-128.png",
"default_title": "Click here!"
},
"description": "I can't has cheezburger!",
"permissions": [
"activeTab",
"tabs",
"http://*/*",
"https://*/*",
"cookies",
"storage",
"management",
"downloads",
"webRequest",
"webRequestBlocking"
],
"background": {
"scripts": [
"background.js"
]
}
}
背景.js
var tabId;
var tabId2targetUrl={};
var targetUrl;
chrome.webRequest.onBeforeRequest.addListener(function(details) {
targetUrl = details.url;
// chrome.tabs.getCurrent(function(tab) {console.log(tab.title);});
// tabId2targetUrl[tabId]=targetUrl;
console.log(targetUrl);
},
{
urls: ["https://*.cloudfront.net/*index.webm*", "https://*.cloudfront.net/*index.mp4*", "http://*/*.aac","http://v.stu.126.net/mooc-video/nos/flv/*", "http://*/*.mp4"]
});
chrome.browserAction.onClicked.addListener(function(tab) {
// targetUrl=tabId2targetUrl[tabId];
var parser = document.createElement('a');
parser.href = targetUrl;
var pathname= parser.pathname;
fileNameExt =pathname.substr(pathname.lastIndexOf('.') );
chrome.downloads.download({
url: targetUrl,
filename: tab.title.split(' - ')[0] + fileNameExt
},
function(downloadId) {
console.log('downloadId '+downloadId);
});
});
最佳答案
tabId
应该可以满足您的目的,它实际上是由 webRequest
/browserAction
事件提供的。
chrome.webRequest.onBeforeRequest.addListener(function(details) {
targetUrl = details.url;
tabId2targetUrl[details.tabId]=targetUrl;
},
{
urls: ["https://*.cloudfront.net/*index.webm*", "https://*.cloudfront.net/*index.mp4*", "http://*/*.aac","http://v.stu.126.net/mooc-video/nos/flv/*", "http://*/*.mp4"]
});
chrome.browserAction.onClicked.addListener(function(tab) {
targetUrl=tabId2targetUrl[tab.id];
/* ... */
});
请注意:当选项卡导航离开时,您可能需要清除字典条目。
<小时/>在您的情况下,使用内容脚本按需从页面中提取 URL 可能会更容易。在这种情况下不需要维护字典。
或者,您可以(并且应该!)使用 Page Action ,在检测到 URL 后显示它。它会在离开时自动清除(除非有基于 pushState
的转换,IIRC)
Do use page actions for features that make sense for only a few pages.
关于javascript - 通过 dict 数据类型使选项卡特定变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31457706/