javascript - 通过 dict 数据类型使选项卡特定变量

标签 javascript google-chrome google-chrome-extension google-chrome-devtools google-chrome-app

我正在编写一个扩展程序,可以检测来自 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/

相关文章:

javascript - 为什么removeEventListener不起作用?

google-chrome - Google Chrome 随机打乱 <object> 标签中的 SVG 图像

javascript - Chrome 扩展 : If my app does not have a default_popup set then I am not able to view Inspect Popup. 如何调试?

javascript - 在 Chrome 选项卡上突出显示基于正则表达式的文本?

javascript - JS 打印 - CSS 文本颜色未显示

javascript - 更新 apollo 客户端实例的 uri

google-chrome - 为什么 chrome devtools 网络面板中的大小选项卡有 2 个单元格?

google-chrome - Chrome 开发者工具/调试器 : "pretty print" does not work

javascript - Chrome 扩展 : Unable to pass message to content. js

Javascript 如何在字符串中包含随机大写字母时使用 .includes()