Установка setTimeout() для window.opener из окна при обратном вызове unload
Я пытаюсь сделать это:
$(function() {
var parent = window.opener;
$(window).bind('unload', function() {
parent.setTimeout(function() {
parent.console.log('Fired!');
}, 200);
}
});
Приведенный выше пример хорошо работает в FF, Chrome и т. Д., Но не в IE8. В последнем случае обратный вызов, указанный в setTimeout(), никогда не запускается.
Обоснование заключается в том, что я хотел бы выполнить некоторый код в родительском окне (window.opener), когда всплывающее окно закрыто. Я бы хотел, чтобы за это отвечало всплывающее окно, а не наоборот.
Просто чтобы показать, что концепция работает:
$(function() {
var parent = window.opener;
$(window).bind('unload', function() {
parent.console.log('Fired!');
}
});
Вызов console.log немедленно в обратном вызове, связанном с выгрузкой (как в примере выше), кажется, работает во всех браузерах (не нацеленных на IE6 здесь), но как только я добавляю setTimeout() в микс, он нарушается.
Является ли это возможным? Это проблема масштаба?
1 ответ
В IE функции привязаны к окну их владельца. Они могут быть вызваны из другого окна, но когда окно выгружено, все его функции умирают. Если вы попытаетесь вызвать его явно после onunload, вы получите сообщение об ошибке "Вызванный объект отключен от своих клиентов".
Так что в случае с ребенком на загрузке вы должны немедленно перезвонить родителю. Если родителю нужна задержка, ему придется предоставить ее самому.
(Вам также следует проверить, что родитель не null
не был closed
и оберните попытку доступа в try
, так что вы не получите сообщение об ошибке, если родительское окно было закрыто или перемещено.)