2010-05-05 142 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()将返回[]如果弹出不开,所以你必须处理。

我不知道为什么没有人提到这一点。也许这有一些陷阱或不好的做法,我忽略了?但在我自己扩展的有限测试中,它似乎工作。

相关问题