您可以在扩展包中创建一个虚拟升级页面,我们称之为 upgrade.html
用它来制作你的结构并添加你想要的 2 个 iframe。如果你想控制它,你可以使用使用后台脚本的消息传递在 2 个 javascript 页面之间进行通信。要从父页面与 iframe 进行通信,只需查看Invoking JavaScript code in an iframe from parent page 中的任何答案
如果您事先不知道要运行的逻辑(尽管您应该知道),那么您可以在页面之间传递整个字符串并在另一侧对它们进行评估 – 尽管这不是您通常想要做的事情。这是消息传递的文档:http: //developer.chrome.com/extensions/messaging.html
简而言之:您的内容脚本有页面 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 样式(远程过程调用)函数,也就是:
// 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);
}
});