监听标签页的打开/关闭并处理现有标签页

4
每当一个新标签页打开时,我都想做一些事情,无论是通过Firefox启动还是在Firefox启动后添加新标签页。我一直在遵循以下示例:https://developer.mozilla.org/en/Code_snippets/Tabbed_browser。因此,我有以下内容:
var container = gBrowser.tabContainer;
container.addEventListener("TabOpen", tabAdded, false);
container.addEventListener("TabClose", tabClosed, false);

function tabAdded(event) {
alert("tabAdded!");
var browser = gBrowser.getBrowserForTab(event.target);
browser.pollingService = new PollingService(createGuid());
browser.pollingService.start();
}

我有一个类似于关闭的功能。对于实际打开/关闭选项卡时,它可以正常工作,但我遇到了一些问题。

首先,当Firefox打开时,它已经打开了初始选项卡,但是tabAdded事件从未触发。同样地,当我关闭Firefox时,它也不会触发那些选项卡的TabClose事件。

在这种情况下,正确的做法似乎是遍历gBrowser.tabContainer中的所有选项卡,并将我的服务添加到它们中,关闭Firefox时也要进行类似的操作。不幸的是,我不太确定如何钩入以知道Firefox何时关闭(还有可能有更好的处理方法,但我想不出来)。

其次,当我的初始化脚本运行时,gBrowser.tabContainer有时可能未初始化;有没有特定的事件我应该监听,以了解何时可以安全地向tabContainer添加侦听器?

1个回答

4
使用加载事件监听器来等待窗口准备好,以便您可以添加选项卡事件监听器并创建现有选项卡的轮询服务。然后使用卸载事件监听器进行清理。

但是加载/卸载事件不是每次网页更改时都会触发,而只有在打开时才会触发吗?我该如何区分页面更改和Firefox实际打开/关闭的时间,以便知道何时进行初始化/清理? - DivineWolfwood
如果您将普通事件监听器添加到(chrome)窗口,则它只会看到chrome窗口的加载和卸载事件,因为它们不会从内容窗口冒泡。(如果您确实需要它们,仍然可以在内容窗口上捕获它们。) - Neil
啊,打开看起来是可以的,但我在卸载时仍然有问题。我正在使用以下代码进行连接:window.addEventListener("beforeunload", this.handleTabClosing, false); 但是handleTabClosing中的警报实际上从未触发;beforeunload是我想要监听的事件,对吗? - DivineWolfwood
1
我不确定在beforeunload处理程序本身中是否允许警报。 (在网页中,您将返回一个字符串以请求警报,但我不知道它是否适用于扩展。)实际的清理代码将进入卸载处理程序。 - Neil
啊,太好了,现在我可以同时收到窗口打开和关闭的通知了。但是由于某种原因,TabOpen事件实际上并没有触发。Tab Close事件是触发的,但TabOpen似乎没有。 - DivineWolfwood
抱歉,我没有看到你的代码片段中任何可能阻止其接收TabOpen事件的问题;我将其与此页面上的示例进行了比较:https://developer.mozilla.org/en/Code_snippets/Tabbed_browser - Neil

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