我只是在点击浏览器操作时才使用programmatic injection将扩展程序的代码注入页面。
这就是我在我的扩展程序event page上的内容(根据the documentation中的示例):
chrome.browserAction.onClicked.addListener(function callback(tab){
chrome.tabs.executeScript(null, {file: "content-script.js"});
});
但是,按照这种方式工作的方式,每次点击按钮> 时都会注入脚本。
如何更改它以便在后续按下按钮时不会注入脚本 - 以便仅在第一次 时单击该页面上的按钮?
答案 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"});
}});