Javascript 如何使我的Chrome扩展只注入一次脚本?

Javascript 如何使我的Chrome扩展只注入一次脚本?,javascript,google-chrome,google-chrome-extension,code-injection,Javascript,Google Chrome,Google Chrome Extension,Code Injection,我使用仅在单击浏览器操作时才将扩展代码注入页面 这是我在分机上的配置(根据中的示例): 但是,按照这种方式,每次单击按钮时都会注入脚本 如何更改它,使脚本不会在随后的按钮按下时被插入-以便仅在第一次单击该页面上的按钮时插入?我现在可以想到的一种方法(简单易行)是使用。由于您是从后台或弹出页面运行此代码,因此它将是正常的 if(!localStorage.getItem("isAlreadyInjected")){ localStorage['isAlreadyInjected'] = "t

我使用仅在单击浏览器操作时才将扩展代码注入页面

这是我在分机上的配置(根据中的示例):

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


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

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

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"});});
}


在contentscript中放入gloabl变量,以判断contentscript是否已执行

if (something) { return; }

这不是关于重新添加侦听器(顺便说一句,这是您希望发生的事情)。这是关于不在侦听器中执行多次操作。这不起作用的原因有两个-它对tabid使用null,因此它只会注入一次,然后在单击其他选项卡时跳过,并且
isAlreadyInjected
值在整个会话中将保持为真,因此不允许重新加载页面,更新后:在重新加载页面后,background.js变量不会被清除。因此,如果重新加载页面,您的代码不会出现,但也不会被注入。内容脚本中的全局变量仅对正在运行的脚本是全局的。@StuartP.Bentley同一页面上相同扩展名的内容脚本共享相同的执行环境,因此,在脚本的第一次运行中声明的全局变量将被第二次运行看到。@StuartP.Bentley,正如rsanchez所说。无法使此工作。return在函数外部不起作用,在函数内部只会退出函数(我应该尝试
exit()
,但是…请继续阅读)。什么东西是如何定义的
var something=true
?是否希望每页、每个窗口或在浏览会话的生命周期中只运行一次代码?实际上,这是否会导致脚本被多次注入?我似乎还记得《华盛顿邮报》的Philip Bump有一个确切的问题,多次运行
executeScript
只会导致脚本第一次运行,并询问我关于它的情况(这就是为什么我被信任的原因)。是的,
chrome.tabs.executeScript
会在您调用脚本时尝试运行脚本。
var bgpage=chrome.extension.getBackgroundPage();
  chrome.browserAction.onClicked.addListener(function callback(tab) { 
 if(!bgpage.isInjected()){
    chrome.tabs.executeScript(null, {file: "content-script.js"});
}});
if (something) { return; }