为什么Windows只打开`onload`事件一次?

时间:2011-05-11 16:41:27

标签: javascript firefox greasemonkey onload

我一直在寻找我的问题的答案 - 到目前为止没有运气。

这是我的代码:

var oNewWindow = window.open(sLink,'_blank');
oNewWindow.addEventListener('load',function() { alert('Page loaded'); }, false);

当弹出窗口/选项卡打开时,调用处理程序,但如果我在弹出窗口内浏览,则永远不会调用处理程序。为什么?有没有办法让它发挥作用?

基本思想是用户打开一个弹出窗口然后开始在弹出窗口中浏览,而父窗口中的代码继续工作并监视弹出窗口中发生的事情。弹出页面是同一域中的页面。

第一次加载弹出窗口后,我附加了一个onunload处理程序,它将在父窗口中调用处理程序,然后启动计时器。然后父窗口的脚本将与弹出窗口的内容一起使用。然而,问题是滞后,如果计时器用完并且弹出窗口中的旧页面仍然存在,我得到不正确的数据,我的整个脚本停止。之后我无法附加另一个onunload处理程序。

为整个窗口设置onload处理程序,而不是窗口中的文档,那么为什么不调用处理程序?

此外,我的脚本在GreaseMonkey的帮助下运行。我不需要这是跨浏览器,因为我只使用Firefox。

3 个答案:

答案 0 :(得分:2)

用户离开原始页面后,打开的窗口不再有打开窗口应用的load事件,这就是警报不会再次触发的原因。

您可以使用的一种方法是在iframe (www.mypage.com/myframe?url=someurl.com)中包含一个包含所需网址的页面,以便子窗口中的页面不会更改,但{{1改变。在这里,您可以在iframe内了解window.opener发生了什么。

答案 1 :(得分:2)

原因是当浏览器导航到新页面时,会为该页面初始化新的window对象。这可能会令人困惑,但最好将window对象视为与操作系统上运行的进程所拥有的窗口无关。

总而言之,导航后父窗口和打开窗口之间的任何关系都会丢失。

答案 2 :(得分:0)

另一种方法是在子窗口中插入一个脚本块,然后执行“load”事件的附加。

这样,它就完全独立于父窗口。