我正试图以这种方式从我的后台脚本访问内容脚本中的函数 -
content.js
window.DOsomething = function(){
console.log('Works?');
}
background.js
var popups = chrome.extension.getViews();
if (popups.length != 0) {
var popup = popups[0];
popup.DOsomething();
}
但它不起作用!它会引发错误Uncaught TypeError: Object [object Window] has no method 'DOsomething'
,但是当我在我的内容脚本中执行console.log(window)
时 - 它告诉我,这样的方法(DOsomething
)存在!但是在popups[0]
列表中没有这样的方法,我真的不明白这样的结果
答案 0 :(得分:3)
这是Chrome扩展程序的一项名为isolated world的已知功能。内容脚本被注入目标页面,无法直接从扩展的其他部分访问。要进行互动,您应该使用messaging。
这有点过时SO answer to a related question,这可能有助于全面了解。在答案中,您应该调整代码以使用sendMessage
代替sendRequest
,而chrome.tabs.getSelected(null, function(tab) {
chrome.tabs.sendMessage(tab.id, {greeting: "hello"}, // you can send "DoSomething" for example
function(response) {
console.log(response.farewell);
});
});
已被删除,而第一个代码则被删除。
例如,您在后台页面中放置以下调用(取自文档):
chrome.extension.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if(request.greeting == "hello")
sendResponse({farewell: "goodbye"});
// else if(request.greeting == "DoSomething") DoSomething();
});
在内容脚本中,您应该收听消息:
getViews
我认为sendMessage
方法不是您想要的,因为它返回您的扩展页面(后台,弹出窗口,选项),而不是注入内容脚本的页面。我想您应该从内容脚本executeScript
到后台页面,以便后者“知道”所有脚本主页,或者您可以使用chrome.tabs.executeScript(tabId, {code: 'DOsomething();'})
。
{{1}}
答案 1 :(得分:-1)
<强> background.js 强>
var message = "What ever you want...";
var viewTabUrl = chrome.extension.getURL('main.html');
var views = chrome.extension.getViews();
for (var i = 0; view = views[i]; i++)
{
if (view.location.href == viewTabUrl)
{
view.DOsomething (messages);
break;
}
}
<强> content.js 强>
function DOsomething (message)
{
// CODE
}
在上面的示例中,我认为'main.html'是你的弹出窗口(html),并且包含了content.js。