Установка setTimeout () для window.opener из окна при обратном вызове unload - PullRequest
2 голосов
/ 10 августа 2010

Я пытаюсь сделать это:

$(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 Ответ

1 голос
/ 10 августа 2010

В IE функции привязаны к окну их владельца. Их можно вызывать из другого окна, но когда окно выгружается, все его функции умирают. Если вы попытаетесь вызвать его явно после onunload, вы получите inv Вызванный объект отключился от ошибки своих клиентов.

Таким образом, при загрузке ребенка вы должны немедленно перезвонить родителю. Если родителю нужна задержка, ему придется предоставить ее самому.

(Вы, вероятно, также должны проверить, что родитель не null, не был closed, и обернуть попытку доступа в try, чтобы вы не получили ошибку, если родительское окно был закрыт или перемещен.)

...