Javascript Chrome扩展:如何在chrom扩展更新后删除孤立脚本

Javascript Chrome扩展:如何在chrom扩展更新后删除孤立脚本,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我有一个带有弹出页面的chrome扩展,通过简单的一次性请求将布尔变量传递到我的内容页面。然后,内容页面将根据从弹出页面传递的布尔变量的状态执行一些操作。这是完美的工作,直到我意外地删除了仍然处于开发人员模式的扩展,扩展被解包并不得不重新加载它 这导致弹出式检查控制台中出现扩展上下文无效错误,网页控制台似乎验证弹出式页面和内容脚本没有通信。chrome扩展处于活动状态的网页显示以下错误:未经检查的运行时。lastError:消息端口在收到响应之前关闭 根据我已经看到的一些答案,重新加载chrom

我有一个带有弹出页面的chrome扩展,通过简单的一次性请求将布尔变量传递到我的内容页面。然后,内容页面将根据从弹出页面传递的布尔变量的状态执行一些操作。这是完美的工作,直到我意外地删除了仍然处于开发人员模式的扩展,扩展被解包并不得不重新加载它

这导致弹出式检查控制台中出现扩展上下文无效错误,网页控制台似乎验证弹出式页面和内容脚本没有通信。chrome扩展处于活动状态的网页显示以下错误:未经检查的运行时。lastError:消息端口在收到响应之前关闭

根据我已经看到的一些答案,重新加载chrome扩展似乎使我的原始工作内容脚本与扩展的其余部分分离,这导致前面提到的未经检查的运行时。lastError:消息端口在收到响应之前关闭。网页控制台上出现错误

我相信我不能再重新注入我的内容脚本,因为我的内容脚本有DOM事件监听器。是否有可能删除当前运行的孤立脚本?或者是否有任何建议解决此问题的方法

这是我的popup.js:

chrome.tabs.query{'active':true,'currentWindow':true},函数选项卡{ chrome.tabs.sendMessagetabs[0].id,{cTabSettings:some boolean variable}; }; 这是我的content.js:

var orphanMessageId = chrome.runtime.id + 'orphanCheck';
window.dispatchEvent(new Event(orphanMessageId));
window.addEventListener(orphanMessageId, unregisterOrphan);

// register all listeners with named functions to preserve their object reference
chrome.runtime.onMessage.addListener(onMessage);
document.addEventListener('mousemove', onMouseMove);

// the popup script checks it to see if a usable instance of content script is running
window.running = true;

function unregisterOrphan() {
  if (chrome.i18n) {
    // someone tried to kick us out but we're not orphaned! 
    return;
  }
  window.removeEventListener(orphanMessageId, unregisterOrphan);
  document.removeEventListener('mousemove', onMouseMove);
  try {
    // 'try' is needed to avoid an exception being thrown in some cases 
    chrome.runtime.onMessage.removeListener(onMessage);
  } catch (e) {}
  return true;
});

function onMessage(msg, sender, sendResponse) {
  //...........
}

function onMouseMove(event) {
  // DOM events still fire in the orphaned content script after the extension
  // was disabled/removed and before it's re-enabled or re-installed
  if (unregisterOrphan()) { return }
  //...........
}
//正在侦听来自popup.js的消息 chrome.runtime.onMessage.addListener functionrequest、sender、sendResponse{ if request.cTabSettings===true{ 启用=真; }如果request.cTabSettings===false,则为else{ 启用=错误; } }; //DOM侦听器和操作 document.addEventListener'mousemove',函数e{ //一些行动 chrome.runtime.sendMessage{sender:content,selText:blah},函数{ 成功; }; },假;
我使用的是chrome开发者模式版本76。换言之,这个chrome扩展正在工作的内容脚本在我意外地重新加载它之前与弹出窗口进行通信。

由于孤立的内容脚本仍然可以接收DOM消息,例如,通过窗口将新工作内容脚本中的一条消息发送到重影内容脚本。收到消息后,您将注销所有侦听器,并使所有全局变量为空,这也将使您的旧脚本符合自动垃圾收集的条件

content.js:

var orphanMessageId = chrome.runtime.id + 'orphanCheck';
window.dispatchEvent(new Event(orphanMessageId));
window.addEventListener(orphanMessageId, unregisterOrphan);

// register all listeners with named functions to preserve their object reference
chrome.runtime.onMessage.addListener(onMessage);
document.addEventListener('mousemove', onMouseMove);

// the popup script checks it to see if a usable instance of content script is running
window.running = true;

function unregisterOrphan() {
  if (chrome.i18n) {
    // someone tried to kick us out but we're not orphaned! 
    return;
  }
  window.removeEventListener(orphanMessageId, unregisterOrphan);
  document.removeEventListener('mousemove', onMouseMove);
  try {
    // 'try' is needed to avoid an exception being thrown in some cases 
    chrome.runtime.onMessage.removeListener(onMessage);
  } catch (e) {}
  return true;
});

function onMessage(msg, sender, sendResponse) {
  //...........
}

function onMouseMove(event) {
  // DOM events still fire in the orphaned content script after the extension
  // was disabled/removed and before it's re-enabled or re-installed
  if (unregisterOrphan()) { return }
  //...........
}
我假设popup.html是加载的,因为它允许我们使用异步/等待语法,而不是令人难以置信的回调地狱,从而使生活更加轻松

<script src="browser-polyfill.min.js"></script>
请查收

这不是关于删除脚本,而是为了避免万一出错