我有一个chrome扩展,它从后台脚本调用内容脚本,将HTML插入到网页中。
当我调用内容脚本(inject.js)时,我想从内容脚本(eventpage.js)中传递一些参数,但是这样做有一些困难。我也不想使用利用chrome.storage或本地存储的解决方案。
Manifest.json (相关部件):
{
"manifest_version": 2,
"content_scripts": [
{
"matches": ["http://*/*"],
"js": ["inject.js"]
}
],
...
"background": {
"scripts": ["eventpage.js",...],
"persistent": false
},
}
Eventpage.js (背景):
// Want to add the parameter here
chrome.tabs.executeScript(tabId, {
file: 'inject.js'
});
Inject.js (内容):
(function() {
// Want to retrieve the parameter passed from eventpage.js here
})();
发布于 2018-02-09 06:50:46
使用信息传递
Eventpage.js
// Want to add the parameter here
var parameterToSend;
chrome.tabs.executeScript(tabId, {
file: 'inject.js'
}, function() {
chrome.tabs.sendMessage(tabId, {parameter: parameterToSend});
});
Inject.js
(function() {
// Want to retrieve the parameter passed from eventpage.js here
chrome.runtime.onMessage.addListener(function(message) {
var receivedParameter = message.parameter;
//use receivedParameter as you wish.
});
})();
发布于 2018-02-08 13:11:29
您想要使用的解决方案有时很方便,但它并不称为内容脚本,它用于在页面上插入HTML的不同情况。您正在尝试将JS的一部分直接插入到网站中,而将inject.js文件指定为内容脚本。
WebExtensions标准中的内容脚本意味着脚本可以访问网页的HTML (除去一些限制,比如iframes)并可以修改它。
考虑将背景脚本的内容更改为:
chrome.tabs.query({active:true, lastFocusedWindow: true}, function(tabs){
if (tabs.length > 0) {
chrome.tabs.sendMessage(tabs[0].id, {
type:"message-type",
param: 'param'
});
}});
在内容脚本中,为从后台检索的消息添加侦听器
chrome.extension.onMessage.addListener(callback);
其中callback
变量应该是要在inject.js文件中运行的函数。这个函数可能在其签名中得到一个参数,当它执行时,它包含作为chrome.tabs.sendMessage
函数的第二个参数传递的JS对象。
在这种情况下
var callback = function(data) {
// here in data.param you have your parameter
}
另外,如果您确实需要使用代码注入,那么您必须做两件事:
inject.js
的content_script部分中删除manifest.json
,并将其添加到web_accessible_resources
部件中。https://stackoverflow.com/questions/48693659
复制相似问题