Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Как узнать открыто ли окно


Автор: aazon 29.6.2006, 16:16
У меня есть дочернее окно, открытое скриптом, и есть фрейм в главном окне. Как фрейм должен обращаться к дочернему окну? Конкретно, нужно проверить, существует ли оно, если нет, то открыть такое же, еcли да - то ничего не делать.

Открытие окна (из фрейма):
Код

var path='index.php';
var dwin=top.window.open(path,'dwin', "width=700,height=200,left=200,top=100,scrollbars");
dwin.focus();


тоесть имя окна, как я понимаю, dwin. Теперь нужно сделать обращение из фрейма в это окно. KAK??? 

Автор: Aliance 30.6.2006, 01:22
По переменной:
Код

var path = 'index.php';
var dwin = top.window.open(path, 'dwin', "width=700,height=200,left=200,top=100,scrollbars");
if (dwin) {
   // окно dwin существует
   dwin.focus();
}


Полезно почитать: http://forum.vingrad.ru/index.php?showtopic=44559 

Автор: Sardar 30.6.2006, 11:00
Aliance, if не нужен, окно всегда будет открыто.

aazon, открывай окна с именами, при повторном открытии существующее окно перезагрузиться. И наоборот, открывай окна _blank|_new если нужно при каждом open открывать новое окно. 

По теме: нет такой колекции. 

Автор: aazon 30.6.2006, 11:07
Мне нужна проверка на существование окна ДО открытия нового такого же. Ситуация такая:
1. Если дочернего окна нет, оно открывается и в него загружается, допустим, a.php
2. Далее пользователь в дочернем окне может нажать на кнопку, и в дочернее окно загрузится b.php.
3. И вот теперь скрипт из фрейма должен помотреть, открыто ли уже дочернее окно. Если нет - то открыть и загрузить в него a.php, а если да, то ничего не делать!

Твое решение не удовлетворяет п.3, сначала НОВОЕ окно открывается (а если было открыто, то явно изменяется УРЛ), и только потом идет проверка. Мне же нужно проверку производить ДО открытия. Пробовал менять строки местами, но такой вариант не работает:
Код

if (dwin)
{
    alert('window exists');
}
else
{
    path='index.php';
    var dwin=top.window.open(path,'dwin', "width=700,height=200,left=200,top=100,scrollbars");
    dwin.focus();
}

 

Автор: Sardar 2.7.2006, 03:26
Тогда никак. Задача специфичная, не думаю что кто либо сталкивался, но вполне возможно что через XPCOM в мозилле либо какой-нибудь фичей в ИЕ можно получить список окон.

Вопрос остаёться открытым. 

Автор: Иль 19.7.2006, 17:31
Sardar
Цитата(Sardar @  30.6.2006,  11:00 Найти цитируемый пост)
Aliance, if не нужен, окно всегда будет открыто.

if обязательно нужен, иначе при блокировании всплывавющих окон (в ИЕ 6.0 проверено)
dwin.focus() будет выкидывать исключение, тк dwin=null
(про try умолчу) 

Автор: zoidberg 20.7.2006, 01:36
Цитата(aazon @ 30.6.2006,  11:07)
Мне нужна проверка на существование окна ДО открытия нового такого же.

А чем этот код не подходит?
Код

<script type="text/javascript">
    var dwin;
    var path = "frame1.html";
    if (!dwin) {
        dwin = top.window.open(path, 'dwin', "width=700,height=200,left=200,top=100,scrollbars");
        dwin.focus();
    }
</script>
 

Автор: Sardar 20.7.2006, 01:38
zoidberg, тем что это не проверка, а открытие окна. 

Автор: zoidberg 20.7.2006, 03:11
Но в начале dwin = undefined! Т.е проверка есть... вот например скрипт откроет только 1 окно:
Код

<script type="text/javascript">
    var dwin;
    var path = "frame1.html";
    function openit() {
     if (!dwin) {
        dwin = top.window.open(path, 'dwin', "width=700,height=200,left=200,top=100,scrollbars");
        dwin.focus();
     } else alert("It's already open!")
    }
    openit();
    openit();
</script>

Я так и не понял, что хочет автор. Если пытается отловить нажатие на крестик (закрытие окна, то такого события нет. кросс-браузерно - однозначно нет). 
К чему все это?
Цитата

1. Если дочернего окна нет, оно открывается и в него загружается, допустим, a.php

А в какой ситуации его может не быть? Блокировка поп-апов? Тогда хоть голову разбей, но не открыть его.
Цитата

2. Далее пользователь в дочернем окне может нажать на кнопку, и в дочернее окно загрузится b.php.

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

3. И вот теперь скрипт из фрейма должен помотреть, открыто ли уже дочернее окно. Если нет - то открыть и загрузить в него a.php, а если да, то ничего не делать!

Ну так! Если dwin undefined, то пусть скрипт его откроет! Но если пользователь его закроет, то это событие отловить не удастся... или, например, можно спамить дочернее окно при потере фокуса. 
зы: а может мне пора спать уже т.к я не догоняю.  smile  

Автор: Sardar 20.7.2006, 14:14
zoidberg, проблема в том что проверка на открытие окна нужна не в течении одного и того же сеанса, а между загрузками страницы. Открыл окно, перезагрузился, проверил есть ли оно ещё. Вообще плохое то решение, которому потребуеться знать открыто ли окно.

И как уже сказал Иль, требуеться убедиться действительно ли открыто окно, т.к. оно может быть заблокированно. 

Автор: aazon 21.7.2006, 15:42
Окна точно не блокируются, на счет этого проблем нет
Цитата

Вообще плохое то решение, которому потребуется знать открыто ли окно.

Согласен, но в некоторых ситуациях приходится вносить коррективы "на лету", и поэтому возникают такие ситуации 

Автор: 12345c 22.7.2006, 01:38
aazon
Цитата(aazon @  30.6.2006,  11:07 Найти цитируемый пост)
2. Далее пользователь в дочернем окне может нажать на кнопку, и в дочернее окно загрузится b.php.

может быть, вы путаете слово "окно" и "документ"? Иначе бы проблему так долго не обсуждали. Если туда загрузился b.php, то надо ли загружать a.php ?
Цитата(aazon @  21.7.2006,  15:42 Найти цитируемый пост)
Вообще плохое то решение, которому потребуется знать открыто ли окно.
Звучит красиво, если не вдуматься, что во всех межоконных действиях нужно проверять, открыто ли окно.

Ещё тут все забыли, что если пользователь или программа закрыли окно, то dwin остаётся существовать, только dwin.closed==true .

Поэтому, если точно по вопросу, то решение

Код
if(!self.dwin||dwin.closed)открыть_окно;


Но я догадываюсь, что aazon-у нужно ещё то ли нестирание b.php, то ли незагрузка a.php второй раз, если оно уже в окне. Уточните.

Обращение из фрейма к окну - как обычно. dWin определено во фрейме - обращаться надо в общем случае top.frames['имя'].dwin . Из фрейма - можно просто dWin. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)