Chrome扩展程序 - 在后台打开浏览器时打开新标签页(Mac)

时间:2014-09-19 12:06:10

标签: javascript google-chrome google-chrome-extension

二手

Chrome 37.0.2062.120,Chrome扩展程序。 MacBook Pro,MacOS 10.9.3。

授予权限,正在正常打开新标签页。

我使用Chrome通知,如果用户点击通知中的特定按钮,则会打开新标签页。

问题

当Chrome被隐藏" (没有完全关闭,但有点在后台工作,当你点击Mac Chrome左上角的红色气泡时),打开新标签不会触发浏览器恢复" (打开)。

因此,浏览器保持隐藏状态并且没有打开标签(显然没有打开,从技术上讲,调用了回调)。

代码

从background.js开始

// if user triggers new tab open from Chrome Notification
chrome.tabs.create({url:someUrl})

的版本

第1版。标签只是明显没有打开,从技术上来说,调用了回调

第2版。如果在创建选项卡时没有聚焦,则下面的代码会更好地聚焦打开的窗口。但是,并没有解决原来的问题。

chrome.tabs.create({url:someUrl}, function(tab){
  chrome.windows.update(tab.windowId, {focused: true})
})

第3版。我们走了,它在后台抛出错误:

Unchecked runtime.lastError while running tabs.create: No current window

解决方案

非常感谢Xan。

function new_tab(url){
  // trying to create a tab
  chrome.tabs.create({url:url}, function(tab){
    if(!tab) {
      // probably no window available
      chrome.windows.create({url:url},function(win){
        // better to focus after window creation callback
        chrome.windows.update(win.id, {focused: true}) 
      })
    } else {
      // better to focus after tab creation callback
      chrome.windows.update(tab.windowId, {focused: true})
    }
  })
}

当然,如果您需要传递额外的选项或回调,则需要修改此功能。

2 个答案:

答案 0 :(得分:2)

您需要关注窗口:

chrome.tabs.create({url:someUrl}, function(tab){
  chrome.windows.update(tab.windowId, {focused: true});
});

如果没有活动窗口,您需要考虑该窗口并在需要时创建一个窗口:

chrome.tabs.create({url:someUrl}, function(tab){
  if(!tab) {
    // Probably, there was no active window
    chrome.windows.create({url:someUrl, focused:true});
  } else {
    chrome.windows.update(tab.windowId, {focused: true});
  }
});

请注意,这可能不会遵循默认窗口状态(最大化/正常),但总比没有好。我在"background"权限的扩展程序上对其进行了测试。

答案 1 :(得分:0)

此答案仅适用于Linux和Mac(不适用于不存在相关错误的Windows)。

Chrome扩展程序无法关注窗口,除非Chrome的至少一部分是当前活动的窗口。我在一个月前报告了这个错误的详细步骤,重现为Issue 407817: chrome.windows.create({ focused:true }) within a desktop notification does not create a focused window

不幸的是,您无法在扩展程序中执行任何操作。如果它是个人扩展,您可以创建native messaging host并编写将重点放在新窗口上的本机应用程序(如果它不是个人扩展,那么您必须要求您的用户也安装本机消息传递主机)。