如何在已关闭或重新加载的窗口中定义函数?

时间:2015-01-30 03:26:54

标签: javascript dom browser google-chrome-extension tabs

我有一个chrome扩展,其中扩展标签订阅了后台页面发出的事件。因此,后台页面的事件模块保存了对扩展选项卡中定义的处理程序功能的引用。

扩展选项卡可能会关闭,导致处理程序仍然(大部分)工作但不再需要。重新加载扩展选项卡时会发生类似的情况,因为它重新初始化其window对象,累积对窗口中(页面加载时指定为事件处理程序)的函数的(新实例)的多余引用。

我正在寻找的是后台页面事件模块能够识别对已经关闭或重新加载的扩展选项卡中指定的处理程序的引用,以便它们可以相应地过期。

我玩过unloadbeforeunload个事件,为扩展标签提供取消注册其自己的处理程序的机会。这似乎是理论上最理想的方法。不幸的是,这些事件都证明是不可靠的。

3 个答案:

答案 0 :(得分:1)

查看window.closed属性。如果全局上下文是活动的,则为false。如果标签/框架不再有效,则window.closedtrue(其中window为窗口对象,例如iframe的.contentWindow,返回值为{{1} },window.open等的结果。)

虽然如果你在窗口失灵时阻止代码运行,它可能会更好。

答案 1 :(得分:0)

只需在整个脚本中检查reloadwin2(),可能是某种循环。

function reloadwin2(){
if (otherwindow.closed)
{
return false;
}

}

答案 2 :(得分:0)

感谢@Rob的反馈,我提出了以下测试:

window && window.document===document

如果在处理程序中调用此表达式求值为false,则其选项卡已关闭(第一次测试)或自定义处理程序(第二次测试)后其选项卡已重新加载。

处理程序可以返回此测试的结果,以便向事件模块发出信号,使其在过期时过期。

第二个测试有效,因为通过闭包访问document的非限定引用。在定义处理程序时,它始终等于window.document 。另一方面,window.document始终返回当前的document对象。当它们相同时,处理程序实例就是最后一页加载的实例。当然,您不必使用documentwindow的任何对象属性(例如,您自己的全局变量)都可以。

对于记录,我的实现中的扩展选项卡也订阅window.unload,以便他们可以在适当的时间显式取消注册自己的处理程序。这主要起作用,但有一些边缘情况,上述方法可作为合适的后备。