如何从Chrome扩展程序触发特定网站上的功能?

时间:2016-05-08 12:16:47

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

最近开始使用Chrome扩展程序。 我试图找出如何只在特定网站上执行功能。

例如,我想在Stack Overflow上显示一个警告框。我使用Chrome的声明性内容API来匹配主机。

我还没能在SO上找到类似的问题。

我的manifest.json文件在后台运行以下代码块。

'use strict';

chrome.runtime.onInstalled.addListener(function() {
chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
    chrome.declarativeContent.onPageChanged.addRules([{
        conditions: [
            new chrome.declarativeContent.PageStateMatcher({
                pageUrl: {
                    hostEquals: 'stackoverflow.com'
                }
            })
        ],
        actions: [new chrome.declarativeContent.SOOnlyFunction()]
    }]);
});
});

function SOOnlyFunction()
{
    alert('On SO');
}

2 个答案:

答案 0 :(得分:3)

您可以使用Chrome API实现此行为:

  1. 当加载新页面时,您可以调用

    chrome.tabs.onUpdated

    在这里你可以过滤网址

  2. 并创建通知。

    chrome.notifications.create

  3. 在你的清单中添加这些对象:

    "permissions": [  "activeTab","tabs","notifications" ],
    "background": {
        "scripts": ["background.js"],
        "persistent": false
    }
    

    以下是我的background.js的样子。

    chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab){
      if(changeInfo.url != null){
    
         console.log("onUpdated." + " url is "+changeInfo.url);
         // creates Notification.
        showNotification();
    
      }
    
    });
    
    function showNotification() {
    
        chrome.notifications.create( {
          iconUrl: chrome.runtime.getURL('img/logo128.png'),
          title: 'Removal required',
          type: 'basic',
          message: 'URL is',
          buttons: [{ title: 'Learn More' }],
          isClickable: true,
          priority: 2,
        }, function() {});
    
    }
    

    它不完整但你会得到这个想法。

答案 1 :(得分:3)

除了作为操作内置的内容之外,您不能使用chrome.declarativeContent

目前具体是ShowPageActionSetIcon RequestContentScript (仍处于试验阶段)。

无法轻松扩展的原因是因为declarativeContent在本机代码中实现,是JavaScript事件处理程序的一种更有效的替代方法。

总的来说,它是一个雄心勃勃但基本上不可行/不发达/被遗弃的想法来自Chrome开发者,与declarativeWebRequest类似的命运。

使用所述JS处理程序查看the other answer的实现提示。

或者,您仍然可以使用仅在预定义域上激活的内容脚本declared in the manifest使其成为“声明性”(只要您事先知道域为常量)。然后他们可以自己做某事或poke the event/background page做某事。

最后,如果您的目标是重定向/阻止请求,则需要webRequest API