如何在开启页面更改时引用弹出对象?

时间:2010-05-12 13:58:17

标签: javascript safari popup cross-window-scripting

这让我发疯了!

情景:

主页面打开一个弹出窗口,稍后调用其中的一个函数:

newWin = window.open(someurl,'newWin',options);

......以后有些代码......

newWin.remoteFunction(options);

没关系。

现在,弹出窗口仍然打开,主页面更改为第2页。 newWin 不再存在,我需要重新创建弹出窗口对象引用,以便再次调用远程function(newWin.remoteFunction)

我尝试过类似的事情:

newWin = open('','newWin', options);
if (!newWin || newWin.closed || !newWin.remoteFunction) {
    newWin = window.open(someurl,'newWin',options);
}

它可以工作,我可以再次调用newWin.remoteFunction但由于某种原因,Safari会在每次调用open()方法时将Focus()赋予弹出窗口,从而打破导航(我绝对需要弹出窗口在后台工作)。

我只能解决此问题的解决方法是在弹出窗口中创建一个间隔:

if(window.opener && !window.opener.newWin) window.opener.newWin = self;

然后在开启者页面中设置另一个带有一些try / catch的间隔,但它不够优雅且非常低效。

所以,我想知道,在开启窗口中获取不同页面之间的弹出对象引用真的很难吗?

1 个答案:

答案 0 :(得分:0)

尚未测试,只是为了这个想法:

主窗口中的

window.onbeforeunload = newWin.sendYourself();
在PopUp窗口中

function sendYourself() {
    sendingMyself= setInterval('sendMyself',50);
}
function sendMyself() {
    if(window.opener && !window.opener.newWin) window.opener.newWin = self;
}
function okGotIt() {
    clearInterval(sendingMyself);
}

在主窗口中,新页面

window.onload = newWin.okGotIt; //just to make sure we have it...

然而,它仍然太复杂而且效率不高。

有更好的方法吗?