4

仅当单击浏览器操作时,我才使用编程注入将我的扩展程序代码注入页面。

这是我在扩展的事件页面上的内容(根据文档中的示例):

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

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

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

4

2 回答 2

6

在你的 contentscript 中放一个 gloabl 变量来判断 contentscript 是否已经执行。

if (something) { return; }
于 2013-08-28T01:17:33.070 回答
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”不存在时,将添加监听器。之后,即使浏览器关闭并再次打开,此值仍将保持存储,因此不会将侦听器添加到您的扩展程序中。

更新

由于您的背景页面在开始时仅加载一次,因此它可以保留未通过浏览器操作单击重新初始化的变量。因此,您可以使用该变量来完成您的工作!

背景.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"});
}});
于 2013-08-28T01:08:54.207 回答