Chrome扩展程序:添加内容(启用/禁用图标)

时间:2016-08-23 14:21:59

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

我正在为Google Chrome编写扩展程序,当用户点击加载项图标时,我正尝试在当前页面中添加内容。

我想添加启用/禁用扩展程序的可能性,并显示/隐藏每个页面的注入内容。

的manifest.json

"content_scripts": [
  {
    "matches": [
      "http://*/*",
      "https://*/*"
    ],
    "css": ["css/style.css"],
    "js": [
      "js/content.js"
    ]
  }
]

我看不到如何仅为图标点击的页面添加内容,因为每个页面都有脚本。

我还尝试使用后台脚本,但没有成功。

你有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

您应该使用chrome.tabs.executeScriptchrome.tabs.insertCSS来实现此目的。完整的例子:

Background.js

chrome.browserAction.onClicked.addListener(function (tab) {
    chrome.tabs.insertCSS(tab.id, {file: "content_style.css"});
    chrome.tabs.executeScript(tab.id, {file: "content_script.js"});
});

的manifest.json

{
  "name": "Inject js and CSS",
  "version": "1",
  "manifest_version": 2,
  "browser_action": {
    "default_icon": {
      "16": "icon16.png",
      "19": "icon19.png",
      "32": "icon32.png",
      "38": "icon38.png"
    }
  },
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "permissions": [
    "activeTab"
  ]
}

修改:已更新以使用activeTab,事件页面和新图标大小。

答案 1 :(得分:0)

你怎么看?

<强>的manifest.json

{
  "manifest_version": 2,

  "name": "Extension",
  "description": "My extension",
  "version": "0.1",

  "icons": {
    "16": "icons/icon_16.png",
    "48": "icons/icon_48.png",
    "128": "icons/icon_128.png"
  },

  "browser_action": {
    "default_title": "Extension",
    "default_icon": "icons/icon_16_disabled.png"
  },

  "background": {
    "scripts": ["js/background.js"],
    "persistent": true
  },

  "permissions": [
    "activeTab",
    "tabs"
  ]
}

<强> background.js

var activedTab = {};
var injectedTab = {};

chrome.browserAction.onClicked.addListener(function(tab) {
  if (typeof activedTab[tab.id] === 'undefined') {
    activedTab[tab.id] = true;
    chrome.tabs.insertCSS(tab.id, {file: 'style.css'});
    chrome.tabs.executeScript(tab.id, {file: 'js/content.js'});
    chrome.browserAction.setIcon({path: 'icons/icon_16.png'});
  } else if (activedTab[tab.id]) {
    activedTab[tab.id] = false;
    chrome.browserAction.setIcon({path: 'icons/icon_16_disabled.png'});
    if (injectedTab[tab.id]) {
      chrome.tabs.sendMessage(tab.id, {greeting: 'hide'});
    }
  } else {
    activedTab[tab.id] = true;
    chrome.browserAction.setIcon({path: 'icons/icon_16.png'});
    if (injectedTab[tab.id]) {
      chrome.tabs.sendMessage(tab.id, {greeting: 'show'});
    }
  }
});

chrome.runtime.onMessage.addListener(function(request, sender) {
  switch (request.greeting) {
    case 'content_injected':
      injectedTab[sender.tab.id] = true;
      if (activedTab[sender.tab.id] == false) {
        chrome.tabs.sendMessage(sender.tab.id, {greeting: 'hide'});
      }
      break;
  }
});

chrome.tabs.onUpdated.addListener(function(tabId) {
  delete activedTab[tabId];
  chrome.browserAction.setIcon({path: 'icons/icon_16_disabled.png'});
});

chrome.tabs.onActiveChanged.addListener(function(tabId) {
  if (activedTab[tabId]) {
    chrome.browserAction.setIcon({path: 'icons/icon_16.png'});
  } else {
    chrome.browserAction.setIcon({path: 'icons/icon_16_disabled.png'});
  }
});

<强> content.js

console.log('loaded');
chrome.extension.sendMessage({greeting: 'content_injected'});

chrome.runtime.onMessage.addListener(function(request) {
  switch (request.greeting) {
    case 'show':
      console.log('show');
      break;
    case 'hide':
      console.log('hide');
      break;
  }
});

答案 2 :(得分:0)

我为Chrome扩展程序构建了相同的功能。 这将创建一个开/关开关/切换(搜索谷歌时解决这个问题很多名称:)) 我在以下方法中使用app和content脚本之间的按摩:

<强>清单

在所有页面(hover.js)上插入我的内容脚本并运行我的扩展脚本(background.js)

....
"browser_action": {
    "default_icon": {
      "19": "icons/icon-active.png"
    }
  },
"content_scripts": [ 
{ 
  "matches": ["<all_urls>"], 
  "css": ["css/hover.css"], 
  "js": ["js/hover.js"] 
} 
],
"background" : { "scripts": ["js/background.js"] },
....

<强> background.js

这里我们预先设置后台脚本(在所有镀铬窗口上运行)以发送和接收扩展状态

    // start extention as active
var status = true;

// set toggle of extention on browser action click and notify content script
chrome.browserAction.onClicked.addListener(function(tabs) {
  if (status == 'true'){
    status = false;
    chrome.browserAction.setIcon({path: "icons/16x16.png"});
  } 
  else{
    status = true;
    chrome.browserAction.setIcon({path: "icons/icon-active.png"});
  }
  chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
    chrome.tabs.sendMessage(tabs[0].id, {status: status});
  });
});

// check status on tab update and notify content script
chrome.tabs.onActivated.addListener(function() {
  if (status == 'true'){
    chrome.browserAction.setIcon({path: "icons/icon-active.png"});
  } 
  else{
    chrome.browserAction.setIcon({path: "icons/16x16.png"});
  }
  chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
    chrome.tabs.sendMessage(tabs[0].id, {status: status});
  });
});

//send extention status on request
chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    if (request.status == "getStatus")
      sendResponse({status: status});
});

如您所见,有3个功能:

  1. 更改浏览器操作按钮上的状态按钮。

  2. 检查移动到其他选项卡并通知内容脚本时的状态(每个选项卡都有自己的&#34;实例&#34;内容脚本,因此在一个选项卡中禁用可能仍处于活动状态另一个标签)。

  3. 根据内容脚本的请求发送状态响应。

  4. 内容脚本

    // check extention status
    chrome.runtime.sendMessage({status: "getStatus"}, function(response) {
        if (response.status == 'true'){
            // check elements mouse is hover
            document.addEventListener("mouseover", setLink, true);
        }
        else{
            document.removeEventListener("mouseover", setLink, true);
        }
    });
    
    // wait for massage from background script
    chrome.runtime.onMessage.addListener(
      function(request, sender, sendResponse) {
        if (request.status == 'true'){
            // check elements mouse is hover
            document.addEventListener("mouseover", setLink, true);
        }
        else{
            document.removeEventListener("mouseover", setLink, true);
        }
    });
    

    每个内容脚本应首先通过向后台脚本发送按钮来检查扩展的状态,并接收状态更新。

    另外,如果我们在一个标签中关闭延期,当我们更改标签时,我们会通知内容脚本更改。

    我确信在脚本编写方面可以做得更好,但我希望它会有所帮助......