2010-08-10 2 views
2

Я пытаюсь сделать это:Attatching 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() в микс, он прерывается.

Возможно ли это? Это вопрос о масштабах?

ответ

1

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

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

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

+0

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