我一直在寻找问题的答案——到目前为止还没有运气。
这是我的代码:
var oNewWindow = window.open(sLink,'_blank');
oNewWindow.addEventListener('load',function() { alert('Page loaded'); }, false);
当弹出窗口/选项卡打开时,将调用处理程序,但是如果我在弹出窗口内浏览,则永远不会调用处理程序。为什么?有没有办法让它工作?
基本思想是用户打开一个弹出窗口,然后开始在弹出窗口中浏览,而父窗口中的代码继续工作并监视弹出窗口中发生的情况。弹出页面是同一域中的页面。
第一次加载弹出窗口后,我向其附加了一个onunload
处理程序,它将在父窗口中调用处理程序,然后计时器将启动。然后,父窗口的脚本将与弹出窗口的内容一起使用。但是,问题伴随着滞后,如果计时器用完并且弹出窗口中的旧页面仍然存在,我会得到不正确的数据并且我的整个脚本停止。在那之后,我无法附加另一个onunload
处理程序。
onload
处理程序是为整个窗口设置的,而不是窗口中的文档,那么为什么不调用处理程序呢?
此外,我的脚本是在GreaseMonkey的帮助下运行的。我不需要它是跨浏览器的,因为我只使用 Firefox。
一旦用户导航离开该原始页面,打开的窗口将不再具有打开窗口应用的 load
事件,这就是该警报不再触发的原因。
您可以使用的一种方法是让一个页面将所需的 URL 包装在iframe
(www.mypage.com/myframe?url=someurl.com)
中,以便子窗口中的页面不会更改,但iframe
的内容会更改。从这里你可以告诉window.opener
从iframe
内部发生了什么。
原因是当浏览器导航到新页面时,会为该页面初始化一个新的window
对象。 这可能会令人困惑,但最好将window
对象视为与操作系统上运行的进程拥有的窗口无关。
总而言之,导航后,父窗口和打开的窗口之间的任何关系都将丢失。
另一种选择是在子窗口中插入脚本块,然后执行"load"事件的附加。
这样,它就完全独立于父窗口。