Правильный способ обработки всплывающих окон - PullRequest
4 голосов
/ 06 декабря 2009

Я ищу близкое событие для всплывающего окна. Я нашел один для XUL , но он мне нужен для HTML.

Всплывающее окно имеет свойство closed.

>>> var popup = open('http://example.com/', 'popup', 'height=400,width=500');
>>> popup.closed
false

Ну, я могу проверить это раз в полсекунды .

function open_popup() {
  var popup = open('http://example.com/', 'popup', 'height=450,width=450');
  var timer = setInterval(function(){
    if (popup.closed) {
      alert('popup closed!');
      clearInterval(timer);
    }
  }, 500);
}

Я тестировал его на Chrome 4.0.249.27, Opera 10.10, Safari 4.0.4 и Firefox 3.5.5. Все отлично работает.

Но setInterval беспокоит меня. Это безобразно Есть ли лучший способ сделать это?

UPDATE: Я использую всплывающие окна для диалога аутентификации (на самом деле oAuth). Я хочу отправить некоторые данные в родительское окно после закрытия всплывающего окна (через postMessage).

Страница внутри всплывающего окна с другого домена. Поэтому я не могу добавить к нему ни одно событие (unload) из-за ограничений безопасности.

Я не могу использовать iframe из-за скрипта iframe buster. Поэтому я не могу использовать модные диалоговые окна jQuery.

Я не могу редактировать что-либо внутри всплывающего окна.

Ответы [ 3 ]

1 голос
/ 06 декабря 2009

Возможно, вы захотите посмотреть на событие unload, взгляните на Javascript: Popups

edit : поскольку вы сказали, что вы ничего не можете редактировать во всплывающем окне, на самом деле не осталось никаких параметров. Я полагаю, что ваш текущий setInterval код отлично справляется с работой. Вы должны спросить себя, является ли обнаружение закрытия всплывающих окон в реальном времени абсолютно критичным. Этот таймер на 500 миллисекунд, безусловно, не будет напрягать какие-либо ресурсы или ставить компьютер на колени.

0 голосов
/ 06 декабря 2009

Используйте window.opener во всплывающем окне. то есть что-то вроде:

onunload = opener.alert('popup closed');

или

onunload = opener.nameOfAFunction();
0 голосов
/ 06 декабря 2009

Я использовал jQuery Dialog, и у него есть событие закрытия

http://jqueryui.com/demos/dialog/.

Не уверен, правильно ли я понимаю ваш вопрос, почему вы хотите использовать таймер?

...