Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 开发chrome扩展时,如何打开空白页来运行脚本?_Javascript_Jquery_Google Chrome_Iframe_Google Chrome Extension - Fatal编程技术网

Javascript 开发chrome扩展时,如何打开空白页来运行脚本?

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

我正在创建一个chrome扩展,它需要打开一个空白页面,然后根据一些注入的脚本在这个空白窗口中打开1/2个iFrame

我的问题是如何打开一个空白窗口来注入和运行JS

我试图打开一个url为
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);
  }
});