Javascript 开发chrome扩展时,如何打开空白页来运行脚本?
我正在创建一个chrome扩展,它需要打开一个空白页面,然后根据一些注入的脚本在这个空白窗口中打开1/2个iFrame 我的问题是如何打开一个空白窗口来注入和运行JS 我试图打开一个url为Javascript 开发chrome扩展时,如何打开空白页来运行脚本?,javascript,jquery,google-chrome,iframe,google-chrome-extension,Javascript,Jquery,Google Chrome,Iframe,Google Chrome Extension,我正在创建一个chrome扩展,它需要打开一个空白页面,然后根据一些注入的脚本在这个空白窗口中打开1/2个iFrame 我的问题是如何打开一个空白窗口来注入和运行JS 我试图打开一个url为about:blank的页面,但由于以下错误,我无法将脚本注入此页面: chrome.tabs.create({ url: 'about:blank' }, function(tab) { chrome.tabs.executeScript(null, { file: 'jqu
about:blank
的页面,但由于以下错误,我无法将脚本注入此页面:
chrome.tabs.create({
url: 'about:blank'
}, function(tab) {
chrome.tabs.executeScript(null, {
file: 'jquery/jquery.js'
}, function() {
console.log('done', arguments);
});
});
tabs.executeScript: Cannot access contents of url "about:blank".
Extension manifest must request permission to access this host.
显然,此错误消息使我认为我没有访问此url的权限,并更新了清单以允许访问所有url,但我有相同的问题
"permissions": [
"tabs",
"*://*/*"
],
额外信息 我之所以不直接打开url,是因为我有两个url,需要逐个访问。这些文件是升级脚本,我需要从中查看结果
最好的方法是打开一个页面,在窗口的左右两侧都有一个iframe,我可以使用注入的脚本来控制它。您只需在扩展包中创建一个虚拟升级页面,我们称之为upgrade.html 使用它来创建您的结构并添加您想要的2个iFrame。 如果您想控制它,可以使用消息传递,使用后台脚本在两个javascript页面之间进行通信。要从父页面到iframe进行通信,只需查看 如果您事先不知道要运行的逻辑-尽管您应该-那么您可以在页面之间传递整个字符串,并在另一侧对其求值-尽管这不是您通常想要做的事情。以下是用于消息传递的文档:
简而言之:您有一个包含contentscript的页面a,页面B是您的背景页面,页面C是包含2个iFrame的更新页面,然后:
// A.js
var port = chrome.runtime.connect({name: "content-script"});
port.postMessage({ runScript: 'yahoo(); function yahoo; () { alert("Yahoo!"); }' });
// B.js
// The background page is only used as a proxy
var upgrade_port = null;
chrome.runtime.onConnect.addListener(function(port) {
switch (port.name) {
case 'content-script':
// Also you need to query for the upgrade page and open it if it does not exist
port.onMessage.addListener(function(msg) {
upgrade_port.sendMessage(msg);
});
break;
case 'upgrade-page':
upgrade_port = port;
break;
default:
console.warn('Unknown port name: ' + port.name);
}
});
// C.js
var port = chrome.runtime.connect({name: "upgrade-page"});
port.onMessage.addListener(function (message) {
if (message.runScript) {
eval(message.runScript);
}
});
您需要使用端口,否则无法从一页到另一页进行通信。另外,如果您事先在C页中插入JS并使其保持静态,然后将参数传递给函数RPC样式(远程过程调用),也就是:
感谢您的回答,对我最大的帮助是认识到我可以从扩展中打开html页面。这让我能够以我需要的方式完全控制它
// A.js
port.postMessage({action:'RPC', name:'yahoo', args:['hello', 'world', 3]});
// C.js
var RPCs = {
yahoo: function (str1, str2, no) {
alert(str1 + ',\n' + str2 + '\nThis is a number: ' + no);
}
};
port.onMessage.addListener(function (msg) {
switch (msg.action) {
case 'RPC':
if (!RPC[msg.name]) { console.warn('Unknown RPC: ' + msg.name); return; }
RPC[msg.name].apply(RPC, msg.args || []);
break;
default:
console.warn('Unknown action: ' + msg.action);
}
});