0

我創建了Google Chrome瀏覽器操作擴展。它不需要使用彈出頁面。 它有一個持續分析頁面源數據的後臺持久化進程/頁面。但是,這是一個單獨的過程,我不想在後臺執行UI編程注入,就像官方的例子。如何使用內容腳本進行onClicked程序化注入?

我設計了在用戶頁面頂部動態生成UI(結果)的腳本,當點擊Action圖標時需要顯示該腳本。我需要使用內容腳本來完成這個程序化注入,而不是後臺或彈出頁面。

但它不起作用,因爲內容腳本是一個'孤島',不能與其他擴展進行通信,並且沒有對Chrome瀏覽器的完全訪問權限。因此,在內容腳本使用下面的代碼時:

chrome.extension.sendMessage({}, function(response) { 
var readyStateCheckInterval = setInterval(function() { 
if (document.readyState === "complete") { 
    clearInterval(readyStateCheckInterval); 

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

這是我的清單文件的一部分:

"background": { 
    "scripts": [ 
     "src/bg/background.js" 
    ], 
    "persistent": true 
    }, 
    "page_action": { 
    "default_icon": "icons/icon19.png", 
    "default_title": "Show my visitors" 
    }, 
    "permissions": [ 
    "*://*.google.com/*", 
    "background" 
    ], 
    "content_scripts": [ 
    { 
     "matches": [ 
     "*://*.google.com/*" 
     ], 
     "js": [ 
     "src/inject/inject.js" 
     ] 
    } 
    ] 

它不起作用,因爲內容腳本pressumably沒有訪問browserAction.onClicked方法。當使用內容腳本單擊動作擴展圖標時,我確實需要進行編程式注入。有什麼建議麼?

回答

2

事實上,chrome.browserAction.onClicked不能駐留在內容腳本中。

它必須在後臺腳本中被監聽。這是後臺腳本的主要目的:對事件做出反應的統一地點。 Chrome瀏覽器甚至爲後臺頁面引入了一類特殊的後臺頁面,這些頁面僅對事件做出反應,因此非常流行。

您需要決定是否顯示注入路線或程序注入路線。

如果您通過清單注入代碼,您的腳本將始終加載,您可以使用chrome.tabs.sendMessage觸發其中的代碼。

如果您決定僅在點擊時注入代碼,您應該從監聽器中調用chrome.tabs.executeScript,就像您在代碼中所做的那樣。同樣,如果您需要在兩個組件之間進行通信,請使用Messaging

再看一眼Architecture overview

+0

謝謝@Xan。我將使用消息傳遞接口從後臺偵聽器向內容腳本發送通知,無論何時單擊圖標以激活注入的腳本。 – 2015-02-09 15:08:50

+0

請考慮其含義:如果內容腳本始終被注入但很少被激活,這意味着您總是使用一些資源,例如匹配的每個選項卡的內存。如果內容腳本不做別的事情,那麼切換到PI可能是值得的。 – Xan 2015-02-09 15:11:21

+0

當然,正如我在我的文章中指出的那樣,程序注入是我需要的方式。自動注入內容腳本的清單文件僅供參考。謝謝 – 2015-02-09 16:03:26

相關問題