Как ссылаться на всплывающий объект при открытии страницы? - PullRequest
4 голосов
/ 12 мая 2010

Это сводит меня с ума!

Сценарий:

Главная страница открывает всплывающее окно, а затем вызывает в нем функцию:

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

... немного кода позже ...

newWin.remoteFunction(options);

и все в порядке.

Теперь всплывающее окно все еще открыто, и главная страница меняется на страницу 2. На странице 2 newWin больше не существует, и мне нужно заново создать ссылку на объект всплывающего окна, чтобы снова вызвать удаленную функцию. (newWin.remoteFunction)

Я пробовал что-то вроде:

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

И это работает, я могу снова вызвать newWin.remoteFunction, НО Safari по какой-то причине отдает Focus () всплывающему окну каждый раз, когда метод open () называется нарушением навигации (мне абсолютно необходимо, чтобы всплывающее окно работало в фоновом режиме).

Единственный обходной путь, который я могу решить, это создать интервал во всплывающем окне с помощью:

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

, а затем установите еще один интервал на открывающей странице с помощью некоторого try / catch, но это не элегантно и очень неэффективно.

так, мне интересно, неужели так сложно получить ссылку на всплывающий объект между разными страницами в окне открывания?

1 Ответ

0 голосов
/ 12 мая 2010

Еще не проверено, просто для идеи:

в главном окне:

window.onbeforeunload = newWin.sendYourself();

в всплывающем окне:

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...

Однако это все еще слишком сложно и не так эффективно.

Есть ли лучшие способы?

...