2015-01-13 71 views
1

我在Gmail用戶界面中運行了一個內容腳本,我在不同的點注入了一些新的HTML。這一切都可行,但爲了保持代碼清潔,我希望在單個函數調用中將預定義的HTML標記插入頁面的某些部分。Gmail Chrome擴展程序「chrome.extension」undefined

這一切似乎使用chrome.extension.getURL(),但是當我測試這個,它看起來像chrome.extension是未定義的!我無法在文檔中的任何地方找到說明不應該定義的地方以及它應該說明的幾個地方。

我使用的Chrome版本39.0.2171.95(64位)

這裏是鍍鉻的對象看起來像在JavaScript控制檯什麼:

chrome object

首先,任何人都知道爲什麼鉻.extension可能未定義?其次,是否有另一種(也許更好)的方式來做到這一點?我寧願不要在內容腳本中以編程方式將大量的HTML注入到代碼中使用jQuery等的頁面中,但如果沒有其他方式,可以使用此方法。

+0

您是否嘗試在代碼中執行'chrome.extension.getURL()'而不是測試控制檯?或者是您的問題具體關於控制檯? – Xan

+0

我沒有 - chrome.extension.getURL()給出了這個:未捕獲TypeError:無法讀取未定義的屬性'getURL' – BryanP

+0

在您的內容腳本代碼?或者你是否注入了內容腳本中的其他代碼? – Xan

回答

4

如果您正在控制檯中測試此功能,則必須瞭解Isolated World的概念。當你添加一個內容腳本時,它有一個獨立的JavaScript上下文,與頁面隔離。

在開發工具的控制檯選項卡頂部,您會在下拉菜單中看到<top frame>。這是一個選擇正在執行的JS上下文的下拉列表。它將列出文檔中的幀和所有內容腳本注入的擴展。

您在屏幕截圖中顯示的對象chrome對應於網頁通常會看到的內容。如果上下文切換,你會看到不同的畫面:

Switching context

在任何情況下,如果你真的在內容腳本執行chrome.extension.getURL() - 這將是很好的界定。


現在,如果你在頁面中注入一個<script>標籤,並嘗試在代碼 - 它會再次失敗,因爲代碼將在頁面上下文。有關這種情況,請參閱this question

最後,Chrome API的大部分都不會因安全原因暴露給內容腳本。如果an API is undefined when it shouldn't be,您可能需要一個背景頁面爲您完成這項工作。