【问题标题】:Open chrome://newtab from a Chrome extension从 Chrome 扩展程序打开 chrome://newtab
【发布时间】:2013-02-07 00:23:44
【问题描述】:

我尝试编写一个 Google Chrome 扩展程序,当我在短时间内单击左右时,它只会打开一个新选项卡。 JavaScript 没问题,但我将其实现为“content_scripts”脚本。

在我读到的其他一些线程中,我无法从 content_scripts 访问 chrome.* API(chrome.extension API 除外)。

即使没有必要访问 chrome.tabs API 来打开一个新窗口(window.open 应该可以完成这项工作),但我似乎需要它来打开一个带有新标签页的新标签 em> 这显然是不可能通过 window.open 实现的。

所以我真的不知道什么是最好的方法。我可以使用可以从 content_script 调用的背景页面,但我认为应该是一种更简单的方法,我只是不明白。

有人有想法吗?

【问题讨论】:

    标签: javascript google-chrome-extension


    【解决方案1】:

    我认为您的内容脚本必须向您的后台页面发送消息以调用 chrome.tabs.create - 内容脚本不能使用 chrome api,也不能直接与后台页面通信。

    这是一个 reference 关于在 Chrome 扩展中传递消息的详细信息,但这里是示例代码(根据上述参考中的示例修改)

    // in background
    chrome.extension.onMessage.addListener(
      function(request, sender, sendResponse) {
        switch ( request.action) {
           case 'newTab' : {
             //note: passing an empty object opens a new blank tab, 
             //but an object must be passed
             chrome.tabs.create({/*options*/}); 
             // run callback / send response
           } break;
        }
        return true; //required if you want your callback to run, IIRC
      });
    
    // in content script:
    chrome.extension.sendMessage({action: "newTab"}, function(response) {
      //optional callback code here.
    });
    

    【讨论】:

    • 谢谢,这很好用。我考虑过使用事件页面,但我没有设法让它们进入我的大脑(也许是时间,在德国凌晨 2 点)。 ;-) 但这仍然让 Chrome 向我发送有关已启动背景页面的通知。这对我来说实际上没问题,但我想如果 Chrome 关闭,这个页面也会继续运行,这对于事件页面来说绝对没有必要......
    • @user2048874:后台页面将在每个会话中生效,并在会话关闭时停止。
    【解决方案2】:

    简单易行

    document.body.onclick = function openNewWindow(  ) {
      window.location.href = 'javascript:void window.open( "chrome://newtab" )';
    }
    

    清单:

    ,"permissions":[
        "http://*/*"
        ,"https://*/*"
      ]
      ,"manifest_version": 2
      ,"content_scripts":[{
        "matches":[
          "http://*/*"
          ,"https://*/*"
        ]
        ,"js":[
          "js/openWindow.js"
        ]
      }]
    

    好吧,我想念这个问题……已修改

    【讨论】:

    • 对不起,这不是我需要做的。正如我所说,我特别想打开 Chrome 新标签页,它是 chrome://newtab,并且无法通过 window.open()。
    • 我认为我比我更喜欢这个解决方案 - 不必胡乱传递消息是一个优点。
    • 感谢您的努力,但这仍然无法正常工作。也许我应该只描述这个问题 - 打开了一个窗口(我首先尝试了和你一样的方法)但是 Chrome 不会从 window.open() 打开新标签页,而是一个 about:blank 页面。这就是整个问题。 :-)