Jump to content
  • 0

Закрытие дочерних окон - маленькая проблема.


Шурик_
 Share

Question

Собственно, задача в том, чтобы при закрытии родительского окна или выгрузке из него родительского документа закрывались порожденные им дочерние. Вроде задача простая - в родительском окне по событию unonload применяем метод close() к именам всех закрытых окон.

Однако возникает проблема - а если дочернее окно не было открыто? Тогда при выгрузке документа мы применяем метод к имени, которое не существует. Возникает ошибка. Конечно, она не фатальна, но консоль ошибок вылезает, у кого она включена, и вообще, хочется все делать так, чтобы не было ошибок.

Что же можно сделать? Как с объектами здесь поступить не получится - известно, что массива дочерних окон не существует, их нельзя как объекты, обнаружить и перебрать по очереди, их можно вытаскивать только по именам.

Проверка на существование окна вызывает ту же ошибку - если мы пишем if(popupWin) - предполагается, что объект может возвращать истину или ложь, а его нет вообще такого.

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

Но тогда вылезает другая ошибка - пишет объект не имеет свойств. Собственно, я так понял, что создать объект дочернего окна полноценно можно только, открыв это окно.

У меня только одна мысль, как избавиться от этих ошибок. Ввести глобальную переменную присвоить ей FALSE, а если скрипкт открывает окно, то присваивать ей TRUE. А в обработчике unonload проверять, и применять к окну метод close, только если переменная TRUE. Но способ уж больно топорный. Может есть поизящнее?

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Шурик, в родительском окне создайте массив (например childWins), при создании дочернего окна - сохраняйте на него ссылку в массиве (например: childWins.push(window.open(...)); ). При закрытии родительского окна пройдитесь по массиву и закройте все дочерние.

Link to comment
Share on other sites

  • 0
Шурик, в родительском окне создайте массив (например childWins), при создании дочернего окна - сохраняйте на него ссылку в массиве (например: childWins.push(window.open(...)); ). При закрытии родительского окна пройдитесь по массиву и закройте все дочерние.

Ну да так и придется. Еще Вы забыли добавить, что пользователь может закрыть дочернее окно и сам, поэтому в дочерних окнах надо по событию unonload обращаться к опенеру родителю и убирать из массива имя этого окна.

Грустно лишь то, что дочерние окна открываются множеством скриптов, в том числе и взятых (купленных) готовыми у посторонних людей, и придется во все эти скрипты вносить изменения в той части, которая открывает и закрывает окно.

Link to comment
Share on other sites

  • 0

Шурик, из родительского окна в дочерние вроде можно "внедрять" произвольный js код. Где-то с этим уже сталкивался, помню что в некоторых случаях бывают ограничения. Вечером посмотрю.

Link to comment
Share on other sites

  • 0

В общем не надо ничего внедрять :D

Утрировано:

window.onload = function() {
var btnCreate = document.getElementById("create");
var btnClose = document.getElementById("close");

var cwins = [];
var wcount = 0;
btnCreate.onclick = function() {
var win = window.open("http://google.ru", "_blank", "status=1,width=250,height=250");
win.__wcount = wcount++;
win.__loaded = false;
win.onload = onLoadChildWin;
win.onunload = onCloseChildWin;
cwins[win.__wcount] = win;
}

btnClose.onclick = function() {
for (var k in cwins) {
if (null !== k) {
cwins[k].close();
}
}
cwins = [];
}

function onLoadChildWin() {
this.__loaded = true;
}

function onCloseChildWin() {
if (this.__loaded) {
cwins[this.__wcount] = null;
}
}
};

Можно даже не сбрасывать ссылку (cwins[this.__wcount] = null;) при закрытии дочернего окна. Она просто напросто примет значение undefined. Потому при закрытии всех окон достаточно будет написать

if (cwins[k]) {
cwins[k].close();
}

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy