关闭由Google Chrome扩展程序创建的弹出窗口

25
我试图创建一个Chrome扩展程序,用来替换Delicious书签工具。我知道已经有一个这样的扩展程序,但它的问题在于在你收藏一个网站后,弹出窗口会一直保持打开状态(与使用书签工具不同,那时弹出窗口会在提交表单后自动关闭)。我重新创建了这个扩展程序,但遇到了同样的问题。
这是我的代码:
manifest.json:
{
  "name": "Delicious",
  "version": "1.0",
  "description": "Bookmark a site on Delicious",
  "background_page": "background.html",
  "permissions": [ 
    "tabs" 
  ],
  "browser_action": {
    "default_icon": "delicious.png"
  },
  "content_scripts": [
    {
      "matches": ["http://www.delicious.com/save*"],
      "js": ["contentscript.js"]
    }
  ]
}

background.html:

<html><script>
chrome.browserAction.onClicked.addListener(function(tab) {
  chrome.tabs.getSelected(null, function(tab) {
    w = window.open('http://delicious.com/save?url='+
          encodeURIComponent(tab.url)+
          '&title='+encodeURIComponent(tab.title)+
          '&v=5&noui=1&jump=close',
        'deliciousuiv5',
        'location=yes,links=no,scrollbars=no,toolbar=no,width=550,height=550');
  });
});
</script></html>

contentscript.js:

if (document.URL == 'http://www.delicious.com/save')
{
  alert('closing...');
  self.close();
  alert('should have closed by now');
}

当我点击 Delicious 按钮时,弹出窗口正常显示并且我可以保存书签,但是在我点击 "保存" 后,弹出窗口并未关闭。两个警示框都显示出来了,但是 self.close() 似乎没有起到作用。当我在 contentscript.js 中删除 URL 检查后,弹出窗口就像正常一样显示出来,第一个警示框立刻触发,然后弹出窗口自动关闭(应该如此)。

为什么它不起作用?Chrome 是否防止我使用 self.close()?Delicious 做了什么?还是其他原因?

如果你需要这些文件,它们在这里:[由于 drop.io 停业,链接已删除]


窗口对我自动关闭。如果有任何区别,我正在运行相当默认版本的Chrome。 - Darryl Hein
4个回答

20

尝试使用window.close(),但可能也不起作用。

由于您创建的是普通窗口(而不是浏览器行为弹出窗口),因此可以从后台页面使用chrome.tabs.remove()关闭它。您还可以从后台页面检测此窗口。类似这样:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
    if(changeInfo.status == "loading") {
        if(tab.url == "http://www.delicious.com/save") {
            chrome.tabs.remove(tabId);
        }
    }
});
我不确定Chrome如何处理创建的窗口 - 是作为选项卡还是窗口。如果是窗口,则上面的代码会有些不同。

9
window.close()可以关闭弹出窗口。如果你想在向另一个标签页发送请求后关闭弹出窗口,确保在回调函数中关闭弹出窗口,并且该标签页必须至少收到一个空响应。 - Martins Balodis
1
从内容脚本关闭窗口是可能的吗? - chovy

9

我发现了一个非常简单的解决方法。只需将选定的标签设置为True,弹出窗口就会消失,像这样...

// remove popup by selecting the tab
chrome.tabs.getSelected(null, function(tab) {
    chrome.tabs.update(tab.id, { selected: true } )
});

5
现在chrome.tabs.getSelected已经过时。 - Konstantin Smolyanin

1

getSelected对我不起作用,所以我找到了这个解决方案

chrome.tabs.create({url: 'https://www.google.com', active: false});

在 background.js 中,你只需要这样:
window.close();

0
我找到了这个解决方案:chrome.tabs.update({ active: true }); 这一行代码可以关闭浏览器操作的弹出窗口。你甚至不需要传递tab.id,因为默认情况下它被设置为当前标签页的id。我在后台页面运行它,但似乎它可以在扩展程序的任何地方运行。

很不幸,这对我没有起作用。我正在更新与此页面上发布的类似getSelected()代码,并且我编写了这段代码,期望它能够正常工作,根据文档所说。 - offthat
这可能取决于许多情况。您将调用此方法放在哪里?也许在某些未被调用的回调处理程序中等等... - Konstantin Smolyanin
我最终只是存储了一个指向弹出窗口的引用,这样我就可以调用popupRef.Close()来关闭它,这就解决了问题。 - offthat
@offthat - 你把引用存储在哪里了?我也想试试。 - Sridhar Sarnobat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接