У меня есть главное окно (№1) на моей веб-странице, из которого я открываю новое окно браузера (№2), из которого я открываю новое окно (№3).
Теперь, если мой пользователь закрывает окно №2 перед окном №3, у меня возникает проблема, заключающаяся в том, что окно №3 больше не может вызывать функцию в своем window.opener, поскольку оно исчезло.
Что я хотел бы сделать, так это установить окно №3. Открыватель для окна №1, когда окно №2 закрывается.
Я пробовал сделать это в окне №2 (кстати, использую jquery):
var children = [];
$(window).unload( function( ) {
$.each( children, function( p, win ) {
if ( win ) {
win.opener = window.opener;
}
} );
} );
Когда окно №3 загружено, я добавляю это окно к дочернему массиву в окне №2.
Но все же, когда окно №2 закрывается перед окном №3, window.opener окна №3 не указывает на окно №1.
Как мне убедиться, что мое большое дочернее окно (окно №3) все еще может вызывать главное окно (окно №1) после закрытия окна №2?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это может быть касательно, но зачем вам открывать 3 отдельных окна? Можете ли вы вместо этого использовать диалог jQuery? Я очень расстраиваюсь, когда приложения открывают на мне окна.
window.opener, вероятно, доступен только для чтения. Я бы установил ваше собственное свойство, чтобы ссылаться на дедушку и бабушку, когда загружается внук.
function onLoad() {
window.grandparent = window.opener.opener;
}
В третьем окне вы вводите:
<script type = "text/javascript">
var grandMother = null;
window.onload = function(){
grandMother = window.opener.opener;
}
</script>
Это у вас есть дескриптор бабушкиного окна, и вы можете использовать его для чего угодно напрямую:
if (grandMother)
grandMother.document.getElementById("myDiv").firstChild.nodeValue = "Greetings from your grandchild !-";
Вы должны создать ссылку на главное окно, когда откроется третье:
parent = window.opener.opener
Это переживет второе закрытие окна.
var main_window = get_main_window();
function get_main_window(){
var w = window;
while(w.opener !== null){
w = w.opener;
}
return w;
}
Пожалуйста, избегайте ответов только с кодом и дайте пояснения вместе с кодом.