0

好吧,我有一个域列表(大约 10 个),我的 chrome 扩展程序将与之交互。

当我研究需要使用的 chrome 扩展文档时,content_scripts 我已将这些行包含在 manifest.json

   "content_scripts": [ {
      "all_frames": true,
      "js": [ "js/main.js" ],
      "matches": [ "http://domain1.com/*",
                   "http://domain2.com/*",
                   "http://domain3.com/*",
                   "http://domain4.com/*",
                   "http://domain5.com/*",
                   "http://domain6.com/*",
                   "http://domain7.com/*",
                   "http://domain8.com/*",
                   "http://domain9.com/*",
                   "http://domain10.com/*"
      ],
      "run_at": "document_start"
   }],

这意味着在加载每个页面时,如果 url 与清单文件中定义的 url 匹配,那么 main.js 将被注入到页面中。我对吗?是的。

所以我想在脚本注入时做一些UIpage action

我在清单中包含了这些行:

   "page_action": {
      "default_icon": "images/pa.png",
      "default_title": "This in one of that 10 domains, that is why I showed up!"
   },

似乎还不够。我必须手动触发页面操作。但是哪里 ?我意识到为此我需要一个 background.html 文件。

但为什么我不能在同一个 main.js 文件中包含触发器?回答:

However, content scripts have some limitations. They **cannot**:

 - Use chrome.* APIs (except for parts of chrome.extension)
 - Use variables or functions defined by their extension's pages
 - Use variables or functions defined by web pages or by other content scripts

因此将其包含在清单中:

"background_page": "background.html"

这是内容:

        <html>
          <head>
            <script>
                function check (tab_id , data , tab){
                    //test just one domain to be simple
                    if (tab.url.indexOf('domain1.com') > -1){
                        chrome.pageAction.show(tab_id);
                    };
                };
                chrome.tabs.onUpdated.addListener(check);
            </script>
          </head>

        </html>

到这里为止还算公平,

我想要但我不知道的是如何添加打开/关闭扩展的功能。

用户单击页面操作图标 -> 图标更改并关闭/打开(main.js 会有所不同)

4

1 回答 1

1

除了通过清单添加内容脚本,您还可以将chrome.tabs.onUpdated与 结合使用chrome.tabs.executeScript

// Example:
var url_pattern = /^http:\/\/(domain1|domain2|domain3|etc)\//i;
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    if (url_pattern.test(tab.url)) {
        if (changeInfo.status === 'complete') { // Or 'loading'
            chrome.tabs.executeScript(tabId, {'file':'main.js'});
            chrome.pageAction.show(tabId);
        }
    } else {
        chrome.pageAction.hide(tabId);
    }
});

不要忘记检查 value changeInfo.status,否则内容脚本将被执行两次。

在这些if语句之一中,您可以合并检查扩展是否处于活动状态,并对其采取行动:

if (changeInfo.status === 'complete' && am_I_active_questionmark) ...

侧不:除了使用background_page,您还可以使用"background": {"scripts":["bg.js"]},并将后台脚本放在bg.js.

于 2012-06-08T08:56:42.600 回答