2011-05-11 44 views
1

我一直在寻找对我的问题的答案 - 迄今为止没有运气。为什么窗户只打开一次`onload`事件?

这里是我的代码:

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

当弹出窗口/选项卡中打开的处理程序被调用,但如果我浏览弹出窗口里面,处理程序不会被调用。为什么?有没有办法让它工作?

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

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

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

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

回答

2

一旦用户导航离开原始页面,打开的窗口不再具有由打开窗口应用的load事件,这就是为什么该警报不会再次触发。

您可以使用的一种方法是在iframe(www.mypage.com/myframe?url=someurl.com)以内包含所需url的页面,以便子窗口内的页面不会更改,但iframe的内容会更改。从这里您可以告知window.openeriframe内正在发生什么。

+0

非常好的方法。加载包含iframe的弹出窗口。然后从父脚本访问iframe并将'onload'事件附加到它,然后'iframe.src = link'。父脚本具有iframe的句柄,因此可以分析内容。 – user1651105 2011-05-11 17:15:10

2

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

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

0

另一种替代方法是将脚本块插入到子窗口中,然后该子窗口将执行附加的“加载”事件。

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