Перейти к содержимому

Фото
- - - - -

JavaScript общение окна-потомка с родителем


  • Вы не можете создать новую тему
  • Please log in to reply
9 ответов в этой теме

#1 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 10 Июль 2005 - 23:48

Требуется организовать общение 2х окон (с фреймом всё ясно, а вот с отдельным окном и фреймом в нём - неизвестно)

Более подробно:

Есть сайт. На нём есть постоянно обновляющийся iframe, если в этом Iframe что-то появляется, текст должен пойти в отдельный фрейм окна-потомока (которое мы создадим в момент получения текста)... Надеюсь, идея ясна?

Это должно быть некое подобие системы оповещения! Самый простой пример - окно чата (ICQ).

P.S. я редко получаю ответы на свои непростые вопросы, обычно всё решаю сам, но вдруг тут есть мастер по JavaScript'у? ;)

Добавлено в [mergetime]1121031979[/mergetime]
Ура! Я это сделал (сам)... Прочитав всего 1 раз мануал. Я почему-то думал, что это будет сложнее! Вот реализация:

mother.html
<html>
<head>
<script language="JavaScript">
<!-- hide

function openWin()
{
  myWin= open( "sms.html", "sms" );
}

function WriteToWin1()
{
  myWin.frame1.document.open();
  myWin.frame1.document.write( "Test<br>Test" );
  myWin.frame1.document.close();  
}

function WriteToWin2()
{
  myWin.frame2.document.open();
  myWin.frame2.document.write( "Test2<br>Test2" );
  myWin.frame2.document.close();  
}

// -->
</script>
</head>
<body>

<form>
<input type="button" value="Open Window" onClick="openWin()">
<input type="button" value="Send Text 1" onClick="WriteToWin1()">
<input type="button" value="Send Text 2" onClick="WriteToWin2()">
</form>

</body>
</html>

sms.html
<html>
<frameset rows="50%,50%"> 
  <frame name="frame1">
  <frame name="frame2">
</frameset> 
</html>

Очень очень удобная штука!

Добавлено в [mergetime]1121032126[/mergetime]
Будут комментарии?

Сообщение изменено: Setor (10 Июль 2005 - 23:48 )

  • 0

#2 ParadoxL

ParadoxL
  • Постоялец
  • 4 756 сообщений
  • Откуда:Edinburg

Отправлено 11 Июль 2005 - 11:49

Думаю самый лучший способ сделать некий hidden фрейм ... в котором не отпускать контент. Если я конечно првавильно понял твой "геморой". И вследвии чего достаточно рпотсо туда закидывать JS [в реале я делал JS + (XML - XSLT)], который будет перенаправляться по требуемым фреймам и не надо будет рефрешить твою основную фрейму. То есть добиться полной динамики используя живой скрытый фрейм. Так я делал в Eesti Energia (регистратор событий) и так же делал в sky чате.

Добавлено в [mergetime]1121075387[/mergetime]
А по сути ... если же я всё - таки неверно понял проблему. Отвечу на твой вопрос в другом ракурсе досутчаться ... из frame1 и frame2 или до папы можно исполщуя свойво .parent ... то есть.

из frame1 свойсво parent - будет указывать на окно предок (то есть в твоем варианте mother.html). А parent.frame2 на паральненое по иерархии фрейм2 ... то есть из frame1 достукивани до frame2 осуществляется шагая по DOM. Что и следовало предположить. Это избавляет от использования ненужного JS кода в mother.html, так как дочении фреймы могут понимать друг друга и напрямую.
  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...

#3 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 11 Июль 2005 - 12:19

CyBurglar, конечно динамический фрейм фрейм у меня скрыт. В данном примере это было сделано для наглядности.

На данный момент события "улавливаются" по такой схеме: в обновлённом фрейме приходит какой-то код JavaScript. Например, там будет определённая переменная и вызов функции. В варианте с чатом - в переменной будет текущее состояние разговора. Но! Эта переменная с фызовом функции придёт к нам только в том случае, если кто-то что-то написал в чат. Сделано это для того, чтобы по 10 раз не делать InnerHTML в окне чата пользователя до тех пор, пока не придёт новое сообщение (в IE обновления не так заметны, а в Firefox "моргает" это место при обновлении...

Главная моя задача - это кроссбраузерность. Пока что всё работает в IE6 & Firefox... Опера почему-то не хочет обновляться. И я примерно представляю в чём там проблема. На данный момент ситуация такова:

На главной странице сайта есть Iframe. В этом Iframe есть 2 фрейма: 1 скрытый постоянно обновляющийся, во 2м отображается информация, пришедшая из 1го. На моём первом примере допустим, приходит мне сообщение. Срабатывает простая функция (это ещё черновой вариант)

function chat()
{
  // Если пришла переменная chat_data
  if ( frame2.chat_data )
  {
    // И popup окошко - чат закрыто, откроем его
    if (!myWin || myWin.closed )
      myWin = window.open( "page1.html" );
  }
}

которая откроет новое окошко, если оно ещё не открыто. В окошке пока что я использую iframe для отображения пришедших сообщений, чтобы была удобная полоска прокрутки и поддержка HTML тегов.

Для обновления сообщений мне приходится "залазить" в этот далёкий iframe и тут походу, Opera останавливается. Нужен отладчик ;)
  • 0

#4 ParadoxL

ParadoxL
  • Постоялец
  • 4 756 сообщений
  • Откуда:Edinburg

Отправлено 11 Июль 2005 - 12:22

Setor, со стороны сервера у тебя PHP?
  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...

#5 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 11 Июль 2005 - 12:30

Да. Именно PHP.
  • 0

#6 ParadoxL

ParadoxL
  • Постоялец
  • 4 756 сообщений
  • Откуда:Edinburg

Отправлено 11 Июль 2005 - 12:38

Setor, короче делается это так ... ты свою скрытую форму не отпускаешь ... и просто время от времени добавлешь туда контент путем глобальных переменных например. Клиентический бравзер вечно остается на подсоединении и берет из фрейма новые данные и распихивает их по указаным фреймам. Это избавляет от разного рода гемороя с рефрешингом. А при нажатии выход например. В висячий PHP код, через туже глобальную переменную передаетмя мега код, говорящий отпустите меня ... я хочу выйти. Или сам выходит по таймауту (инициатором является здесь клиент) если не происходит добавлений в скрытый фрем определенное время (хотя наврядли это может произойти, так как врядли кто лазит в настройках своих правзеров до того низко). И всё работает.

ЗЫ! Если не понял, то могу наброски кода написать ... правда время пойдет. (по работе дел много).

Добавлено в [mergetime]1121078309[/mergetime]
Глобальные переменные думаю лучше заминить темп таблицей в базе ...
  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...

#7 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 11 Июль 2005 - 12:54

Значит, при 1000 пользователей Online у меня будет открыто 1000 соединений только на одни фреймы? Многовато...

По моей задумке система такова: это фрейм поддержания сессии пользователя. Если окно сообщений не открыто, то обновление будет происходить не чаще чем один раз в 30 или даже 60 секунд. Если открыто, то, например, один раз в 15 секунд.

Я написал свою версию сессий, точней, переопределил существующую систему session_set_save_handler (устанавливает пользовательские функции хранения сессии). Мои сессии будут храниться в базе данных. По ним будет строиться список онлайн-юзеров. Если от юзера не было откликов в течение последних N-минут, то сессия закрывается, а его UPTIME складывается в другую таблицу. Можно так же сохранить и состояние текущей сессии. Убирать из базы "мертвых" пользователей будет скрипт, который запускается кроном раз в N-минут. Получается очень удобная штука!
  • 0

#8 ParadoxL

ParadoxL
  • Постоялец
  • 4 756 сообщений
  • Откуда:Edinburg

Отправлено 11 Июль 2005 - 13:02

Setor, я не буду вступать в дисскусию но лиж скажу одно. Пропускная способность канала? :) Каждые 15 секунд делается рефрешь ... то есть запрос + ответ (пусть даже небольшой это минимум 1-3 кб). У тебя 100 узеров ... они делают запрос в среднем 5/3 секунды по 10 человек ... то есть каждые примерно полторы секунды клиенты пытается открыть заного по 10 соединений взять контент и отлючится ... то есть даже при идеальном условии работы сервера (5 соединений в секунду) ... очередь конекшенов всегда переполнена. Сервер трещит по швам ... и только один чат. А ты туда хочешь еще навешать +900 пользователей и другие детские обиды! :) Всё тормозит ... у тебя уши горят, так как народ вспоминают тебя и твою маму почем зря. ЗАНАВЕС! :)
  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...

#9 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 11 Июль 2005 - 13:20

Ммм... тоже верно :) Я подумаю над твоим предложением... Оно кстати, выигрывает в плане скорости доставки сообщений. Чувствую, тут для одного только чата нужен целый выделенный сервер ;)
  • 0

#10 ParadoxL

ParadoxL
  • Постоялец
  • 4 756 сообщений
  • Откуда:Edinburg

Отправлено 11 Июль 2005 - 13:27

Setor, есть у меня одна наработка ... в среднем может сидеть до 10 кб человек на сравнительно небольшом канале. Но тут есть свои минусы. И надо много писать из-за этого это только наработки ... если будет интересно то стучись в аську,MSN или IRC попробую навести на путь истинный. Поймешь - будешь править миром. Шутка :)
  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...