Присоединение setTimeout() к window.opener из окна в обратном вызове выгрузки

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

$(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() в микс, он ломается.

Является ли это возможным? Это проблема масштаба?


person peterfarsinsen    schedule 10.08.2010    source источник


Ответы (1)


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

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

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

person bobince    schedule 10.08.2010
comment
Ой облом. Думаю, тогда я должен попробовать другой подход. Есть ли шанс передать функцию обратного вызова от «дочернего» к родительскому? Комментарии, вероятно, не лучшее место для кода, но я думаю что-то вроде: parent.$(parent).trigger('myEvent', {'callback': function() {alert('foo');} ); Я пробовал это выше, и обратный вызов также, похоже, привязан к дочернему окну. Есть ли шанс, что есть решение для этого? - person peterfarsinsen; 10.08.2010