」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何修復 Chrome 擴充功能中孤立內容腳本導致的「擴充功能上下文無效」錯誤?

如何修復 Chrome 擴充功能中孤立內容腳本導致的「擴充功能上下文無效」錯誤?

發佈於2024-11-08
瀏覽:567

How to Fix \

如何在Chrome 擴充程式更新後刪除孤立腳本

問題

無意中重新載入Chrome 擴充程序,尤其是處於開發者模式的擴充程序,可能會建立孤立內容腳本。這些腳本仍然在後台運行,但與擴展的其餘部分失去了通信,從而導致諸如“擴展上下文無效”和“未檢查的運行時.lastError”之類的錯誤。

解決方案

孤立的內容腳本仍然可以接收 DOM 訊息。刪除它:

1.從新內容腳本發送訊息:

  • 在新的工作內容腳本中,使用 window.dispatchEvent 向孤立腳本發送訊息。
  • 使用唯一訊息標識符,例如 orphanMessageId.

2。在孤立腳本中取消註冊偵聽器:

  • 在孤立腳本中,為 orphanMessageId 定義偵聽器。
  • 在此偵聽器中,取消註冊所有先前偵聽器並取消全域變數。
  • 這使得舊腳本符合垃圾回收條件。

3.後台腳本:

  • 在擴充重新載入/安裝時重新註入內容腳本。

4。內容腳本:

  • 為事件偵聽器使用命名函數以保留其參考。
  • 設定 window.running 屬性以指示活動實例。
  • 收到 orphanMessageId 時,取消註冊偵聽器並將腳本標記為孤立的。

5.彈出腳本:

  • 在發送訊息之前檢查是否存在工作內容腳本。
  • 利用ensureContentScript確保腳本注入。

範例程式碼:

background.js:

// Re-inject content script
chrome.runtime.onInstalled.addListener(() => {
  chrome.tabs.query({ active: true, currentWindow: true }, tabs => {
    chrome.tabs.executeScript(tabs[0].id, { file: 'content.js' });
  });
});

content.js:

// Orphaned script detection and cleanup
var orphanMessageId = chrome.runtime.id   'orphanCheck';
window.dispatchEvent(new Event(orphanMessageId));
window.addEventListener(orphanMessageId, unregisterOrphan);

// Register named listeners
chrome.runtime.onMessage.addListener(onMessage);
document.addEventListener('mousemove', onMouseMove);

// Orphan flag and cleanup function
window.running = true;

function unregisterOrphan() {
  if (chrome.runtime.id) {
    // Not orphaned
    return;
  }
  window.removeEventListener(orphanMessageId, unregisterOrphan);
  document.removeEventListener('mousemove', onMouseMove);
  try {
    chrome.runtime.onMessage.removeListener(onMessage);
  } catch (e) {}
  return true;
}

popup.js:

async function sendMessage(data) {
  const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });
  if (await ensureContentScript(tab.id)) {
    return await chrome.tabs.sendMessage(tab.id, data);
  }
}

async function ensureContentScript(tabId) {
  try {
    const [{ result }] = await chrome.scripting.executeScript({
      target: { tabId },
      func: () => window.running === true,
    });
    if (!result) {
      await chrome.scripting.executeScript({
        target: { tabId },
        files: ['content.js'],
      });
    }
    return true;
  } catch (e) {}
}
最新教學 更多>
  • 我如何創建我的第一個開源專案。
    我如何創建我的第一個開源專案。
    這篇文章是關於我如何決定創建和分享一個簡單的工具來輸入剪貼簿內容,從而產生了 CBPK 專案。 動機 一切都是從我嘗試登入我的 AWS EC2 機器開始的。每次我想使用 Parsec 連接到 AWS EC2 時,我都必須輸入整個作業系統密碼,因為沒有辦法透過 Parsec 進行貼上...
    程式設計 發佈於2024-11-08
  • JavaScript 中的 Promise,4 人指南
    JavaScript 中的 Promise,4 人指南
    隨著 JavaScript 的不斷發展,理解非同步程式設計對於現代開發至關重要。 Promise 是一個強大的工具,可讓您更有效地處理非同步操作。這是有關如何在 JavaScript 專案中使用 Promise 的指南。 什麼是 Promise? Promise 是一個對象,表示非同步操作的最終...
    程式設計 發佈於2024-11-08
  • HTML 表單中的預設提交按鈕行為是什麼?
    HTML 表單中的預設提交按鈕行為是什麼?
    確定HTML 表單中的預設提交按鈕在未按一下特定提交按鈕的情況下提交HTML 表單時,例如按輸入或在JavaScript 中使用HTMLFormElement.submit(),瀏覽器需要確定多個提交按鈕(如果有)中的哪一個應被視為按下的按鈕。此確定對於觸發 onclick 事件處理程序和傳送到 W...
    程式設計 發佈於2024-11-08
  • 程式語言可以模仿變數運算子嗎?
    程式語言可以模仿變數運算子嗎?
    程式語言可以支援變數運算子嗎? 程式語言本身並不支援變數運算子的概念。但是,可以透過建立自訂解決方案來模擬它們的功能。 自訂運算子功能:一種常見方法是定義關聯運算子名稱的物件或映射及其對應的功能。例如,在 JavaScript 中,您可以建立下列物件:var operators = { ' ...
    程式設計 發佈於2024-11-08
  • 編寫 Pythonic 程式碼:更清晰語法的提示和技巧。
    編寫 Pythonic 程式碼:更清晰語法的提示和技巧。
    Python 是一種流行的程式語言,以其可讀性和簡單性而聞名。然而,即使是經驗豐富的 Python 開發人員也可以透過學習新方法來編寫更清晰、更有效率的程式碼而受益。 編寫 Python 程式碼的技巧 以下是編寫 Pythonic 程式碼的一些技巧: 使用描述性變數名稱。選擇清楚表明變數代表什麼的...
    程式設計 發佈於2024-11-08
  • 您可以使用哪些方法來處理 PHP 中的巢狀數組(遞歸或迭代)?
    您可以使用哪些方法來處理 PHP 中的巢狀數組(遞歸或迭代)?
    PHP foreach 與嵌套數組:遞歸方法在 PHP 中使用嵌套數組可能是一個挑戰。考慮一個要存取特定巢狀數組的數組,例如主數組的第二個元素。 可以使用巢狀循環方法來解決此問題:foreach ($tmpArray as $innerArray) { if (is_array($innerAr...
    程式設計 發佈於2024-11-08
  • ## **`std::vector::erase`傳回的迭代器在刪除後是否指向有效元素? **
    ## **`std::vector::erase`傳回的迭代器在刪除後是否指向有效元素? **
    std::vector 迭代器失效:詳細解釋std::vector 中迭代器失效的概念經常被討論。需要澄清的是,透過 std::vector::erase 擦除向量元素會使嚴格位於已擦除元素之後的迭代器無效。 但是,位於已擦除元素的確切位置的迭代器的有效性仍然不確定。從邏輯上講,人們可能會假設該迭代...
    程式設計 發佈於2024-11-08
  • 如何有效率地檢查字串中的字串擴展?
    如何有效率地檢查字串中的字串擴展?
    在字串中尋找字串給定字串 url_string 和一個副檔名清單 extensionsToCheck,確定是否有任何副檔名出現在字串中。一個簡單的方法是遍歷清單並檢查每個擴充功能:for extension in extensionsToCheck: if extension in url_...
    程式設計 發佈於2024-11-08
  • 以下是一些標題選項,請記住問答格式並專注於開發人員的實用性:

**直接切中要害:**

* **我應該使用什麼 Python SOAP 用戶端程式庫
    以下是一些標題選項,請記住問答格式並專注於開發人員的實用性: **直接切中要害:** * **我應該使用什麼 Python SOAP 用戶端程式庫
    有哪些 Python SOAP 用戶端程式庫可用,在哪裡可以找到它們的文件? 在 Python 的 SOAP 用戶端庫領域,存在各種選項,每種選項都滿足至特定要求。對於 SOAP 和 Python 的新手來說,選擇合適的函式庫的任務可能是艱鉅的。以下是可用 SOAP 用戶端程式庫及其文件的綜合指南。...
    程式設計 發佈於2024-11-08
  • 使用 Twig 透過 PHP 渲染 Markdown
    使用 Twig 透過 PHP 渲染 Markdown
    Twig 是使用 Symfony 开发 Web 应用程序时渲染 HTML 的首选模板引擎。 然而,Twig 的灵活性不仅仅限于生成 HTML 页面。它可以成为跨多个渠道交付内容的强大工具,例如生成 Markdown 文件、JSON 输出,甚至纯文本,所有这些都来自同一组内容。 这种适应性允许您为不同...
    程式設計 發佈於2024-11-08
  • 如何在沒有 JavaScript 的情況下使用 POST 參數執行 PHP 重定向?
    如何在沒有 JavaScript 的情況下使用 POST 參數執行 PHP 重定向?
    POST 參數的PHP 重定向提出的查詢涉及將使用者從一個網頁重新導向到另一個網頁,同時保留POST參數。原始方法涉及透過表單將 GET 參數傳輸到 POST 參數,該方法被認為不是最理想的,特別是對於停用 JavaScript 的使用者而言。該問題尋求一個純粹基於 PHP 的解決方案,用於重定向期...
    程式設計 發佈於2024-11-08
  • 如何在 React 中存取提供者外部的上下文時處理錯誤
    如何在 React 中存取提供者外部的上下文時處理錯誤
    使用 React 的 Context API 時,處理元件嘗試存取 Provider 外部上下文的情況非常重要。如果不這樣做,可能會導致意想不到的結果或難以追蹤的錯誤。 問題 當您使用 createContext() 建立上下文時,您可以選擇傳遞預設值。如果元件嘗試存取提供者外部的上下文,則傳回此...
    程式設計 發佈於2024-11-08
  • 如何在 Python 3 中從 Web 伺服器下載檔案?
    如何在 Python 3 中從 Web 伺服器下載檔案?
    如何在 Python 3 中從 Web 伺服器下載檔案簡介從 Web 伺服器下載檔案是許多程式設計中的常見任務項目。 Python 提供了幾個程式庫來簡化此過程,讓您可以輕鬆地從指定的 URL 下載檔案。 使用 urlretrieve 下載檔案import urllib.request url = ...
    程式設計 發佈於2024-11-08
  • Filament:刪除記錄時刪除附件
    Filament:刪除記錄時刪除附件
    Filament 允許您為記錄新增附件,但刪除記錄時不會刪除附件。 為了解決這個問題,我們有兩個選擇: 監聽模型刪除事件 當模型即將被刪除時,它會觸發刪除事件。我們可以監聽此事件來觸發負責在模型不再存在之前刪除任何附件的功能。 在模型類別中,我們可以新增 booted 方法來向模...
    程式設計 發佈於2024-11-08
  • 如何在信用記錄檢索中實現左連接?
    如何在信用記錄檢索中實現左連接?
    How to Perform Left Joins in Doctrine在函數 getHistory() 中,您嘗試擷取使用者的信用歷史記錄。但是,連接子句中的初始語法導致了錯誤。 要在 Doctrine 中執行左連接,可以使用以下語法:$qb ->select('a', 'u') ...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3