如何制作,以便我的Chrome扩展程序只会注入一次脚本?

时间:2013-08-27 23:49:33

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

我只是在点击浏览器操作时才使用programmatic injection将扩展程序的代码注入页面。

这就是我在我的扩展程序event page上的内容(根据the documentation中的示例):

chrome.browserAction.onClicked.addListener(function callback(tab){
  chrome.tabs.executeScript(null, {file: "content-script.js"});
});

但是,按照这种方式工作的方式,每次点击按钮 时都会注入脚本。

如何更改它以便在后续按下按钮时不会注入脚本 - 以便仅在第一次 时单击该页面上的按钮?

2 个答案:

答案 0 :(得分:6)

在内容脚本中放置一个全局变量,以判断内容脚本是否已执行。

if (something) { return; }

答案 1 :(得分:2)

我现在能够想到的一种方法(简单易行)就是使用html5webstorage。由于您从后台或弹出页面运行此代码,因此可以。

if(!localStorage.getItem("isAlreadyInjected")){
   localStorage['isAlreadyInjected'] = "true";
   chrome.browserAction.onClicked.addListener(function callback(tab){chrome.tabs.executeScript(null, {file: "content-script.js"});});}

因此,第一次存储值“isAlreadyInjected”不存在时,将添加侦听器。之后,即使浏览器关闭并再次打开,此值仍将保留存储,因此不会将监听器添加到您的扩展程序中。

<强>更新

由于您的后台页面在开头只加载一次,因此它可以保留未通过浏览器操作单击重新初始化的变量。所以你可以使用那个变量来完成你的工作!

background.js

var isAlreadyInjected =false;
function isInjected(){

if(!isAlreadyInjected ){
    isAlreadyInjected=true;
    return false;
 }
 else
    return true;
}

popup.js

var bgpage=chrome.extension.getBackgroundPage();
 if(!bgpage.isInjected()){
    chrome.browserAction.onClicked.addListener(function callback(tab) {chrome.tabs.executeScript(null, {file: "content-script.js"});});
}

var bgpage=chrome.extension.getBackgroundPage();
  chrome.browserAction.onClicked.addListener(function callback(tab) { 
 if(!bgpage.isInjected()){
    chrome.tabs.executeScript(null, {file: "content-script.js"});
}});