2010-05-05 139 views
6

在谷歌Chrome瀏覽器的extension developer section,它說如何從Chrome擴展的bg頁面訪問彈出頁面的DOM?

擴展 內的HTML頁面都有對方的 DOM的完全訪問權限,他們可以在 相互調用的功能。 ...彈出窗口的內容 是由HTML文件 (popup.html)定義的網頁。彈出窗口不需要 複製代碼是在 背景頁(background.html) 因爲彈出可以

我已經裝入並測試jQuery的背景頁面上調用函數 ,並且可以訪問background.html中帶有jQuery的DOM元素,但我無法弄清楚如何從background.html中訪問popup.html中的DOM元素。

回答

7

你可以討論你爲什麼要這樣做嗎?背景頁面是在您的擴展程序生命週期中永遠存在的頁面。雖然彈出頁面只在您點擊彈出窗口時纔會生效。

在我看來,它應該被其他方式重構,你的彈出窗口應該從背景頁面請求一些東西。你只要做到這一點,在彈出的訪問後臺頁面: chrome.extension.getBackgroundPage()

但如果你堅持,你可以使用與sendRequest()onRequest與擴展頁簡單的溝通。也許你可以使用chrome.extension.getViews

+3

昨天正在調查中,我意識到彈出窗口似乎是暫時的;腳本每次打開時都會重新加載。我曾以爲這是一個持久的對象。但是現在我看到任何彈出狀態需要存儲在後臺並在打開彈出窗口時加載。 – 2010-05-05 12:09:12

3

我明白你爲什麼想這樣做,因爲我自己遇到了問題。

我能想到的最簡單的事情就是使用Google的回調方法 - sendRequest和onRequest方法也能工作,但我覺得它們笨重且不那麼直接。

Popup.js

chrome.extension.getBackgroundPage().doMethod(function(params) 
{ 
    // Work with modified params 
    // Use local variables 
}); 

Background.html

function doMethod(callback) 
{ 
    if(callback) 
    { 
     // Create/modify params if needed 
     var params; 

     // Invoke the callback 
     callback(params); 
    } 
} 
+1

這不起作用,您不能從內容腳本訪問後臺頁面。他們生活在不同的世界。您可以通過消息傳遞來訪問內容腳本中的後臺頁面。您可以在一些示例中快速搜索stackoverflow。 – 2011-01-04 03:19:55

+1

@穆罕默德:問題是關於一個彈出頁面,而不是內容腳本。 – Eric 2011-09-25 08:49:27

0

至於其他的答案中提到,你可以調用background.js功能從popup.js像這樣:

var _background = chrome.extension.getBackgroundPage(); 
_background.backgroundJsFunction(); 

但是訪問popup.js或background.js popup.html,你應該使用信息架構就像這樣:

// in background.js 
chrome.runtime.sendMessage({ property: value }); 

// in popup.js 
chrome.runtime.onMessage.addListener(handleBackgroundMessages); 
function handleBackgroundMessages(message) 
{ 
    if (message.property === value) 
     // do stuff 
} 

然而,似乎可以從同步訪問background.js popup.js,只是就像你可以同時訪問其他方式一樣。 chrome.extension.getViews可以讓你彈出window對象,你可以使用它來調用函數,訪問變量和訪問DOM。

var _popup = chrome.extension.getViews({ type: 'popup' })[0]; 
_popup.popupJsFunction(); 
_popup.document.getElementById('element'); 
_popup.document.title = 'poop' 

注意getViews()將返回[]如果彈出不開,所以你必須處理。

我不知道爲什麼沒有人提到這一點。也許這有一些陷阱或不好的做法,我忽略了?但在我自己擴展的有限測試中,它似乎工作。

相關問題