24

我正在尝试创建一个 Chrome 扩展程序来替代 Delicious 小书签。我知道已经有一个扩展程序可以做到这一点,但是该扩展程序的问题是,在您为站点添加书签后,弹出窗口保持打开状态(与使用书签相反,在提交表单后弹出窗口会自行关闭。我重新创建了扩展并遇到了同样的问题。

这是我的代码:

清单.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"]
    }
  ]
}

背景.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>

内容脚本.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()。美味在做些什么吗?是别的吗?

如果您需要,这些文件就在这里:[链接已删除,因为 drop.io 停业了]

4

4 回答 4

19

尝试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 如何将创建的窗口视为选项卡或窗口。如果作为 windows 那么上面的代码会有点不同。

于 2010-10-16T22:13:22.130 回答
9

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

// remove popup by selecting the tab
chrome.tabs.getSelected(null, function(tab) {
    chrome.tabs.update(tab.id, { selected: true } )
});
于 2010-11-12T05:11:09.460 回答
0

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

于 2013-07-25T20:41:41.067 回答
0

getSelected 不适合我,所以我找到了这个解决方案

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

在 background.js 你只需要

window.close();
于 2018-08-08T17:27:48.860 回答