Непрерывный контекст в чате
Модератор: Absurd
Єто все конечно хорошо я сделал и работает, только можно ли сделать как-то без скритого фрейма (что-би браузер не щелкал).Sorry за язик, а то только ураинская раскладка настроена.
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
IUnknown, если только под IE - смотри в сторону innerHTML и Javascriptом дописывай туда (сам не пробовал, только видел когда-то примеры).
В общем варианте это, скорее всего, невозможно, поскольку в Javascript не предусмотрено возможности дописывать в тело документа текст, после его загрузки. (Исправьте меня, если я не прав).
У меня в голове уже давно крутятся бредовые идеи, что-то типа: сделать текст в чате в виде картинок, которые будут генерироваться серверным языком (например php), а на Javascript только менять картинки (30 сообщений на экране - 30 картинок, они показываются пользователю, а тем временем php переименовывает/сдвигает картинки, первую удаляет, создаёт последнюю с новопришедшим сообщением).
Проблемы:
1. Картинки могут быть отключены
2. Кэширование
3. Так внятную форму эти идеи до сих пор и не приняли
Была бы на JS возможность так же текст менять ... так нет же ...
Но! Поскольку уж эта тема в форуме "Java", то в яве, да через апплет, - это будет совершенно иначе всё выглядеть.
В общем варианте это, скорее всего, невозможно, поскольку в Javascript не предусмотрено возможности дописывать в тело документа текст, после его загрузки. (Исправьте меня, если я не прав).
У меня в голове уже давно крутятся бредовые идеи, что-то типа: сделать текст в чате в виде картинок, которые будут генерироваться серверным языком (например php), а на Javascript только менять картинки (30 сообщений на экране - 30 картинок, они показываются пользователю, а тем временем php переименовывает/сдвигает картинки, первую удаляет, создаёт последнюю с новопришедшим сообщением).
Проблемы:
1. Картинки могут быть отключены
2. Кэширование
3. Так внятную форму эти идеи до сих пор и не приняли
Была бы на JS возможность так же текст менять ... так нет же ...
Но! Поскольку уж эта тема в форуме "Java", то в яве, да через апплет, - это будет совершенно иначе всё выглядеть.
А у меня без проблем дописывает с помощью write / writeln в конец уже существующих сообщений?! А не подскажите как лучше сделать что-бы пользователь вытягивал из базы данных только те сообщения которых у него нет (если например в базе хранится 50 последних сообщений) - может с ними вместе еще и дату обращения пользователя к серверу, для того что-бы вытягивать только те которые пришли после того времени когда он впоследний раз обращался к серверу?!
А может кто слышал как работают чаты у которых есть еще автономно работающий чатовой демон (написаный на Си или еще на чем-то)? Я видел такие и у них нет щелкания браузера - сообщения добавлябтся сами собой плавно. И еще может кто знает как работает chat.bigmir.net - а то мне очень уж нравится как он выводит сообщения?
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
IUnknown,
write / writeln - это на каком языке?
Если через Java это делать - то можно создать Thread, наверное (не знаю точно, какие там на applet ограничения есть), и в нём опрашивать БД.
В своём классе в переменной int lastMessageId хранишь последнее сообщение которое показано у пользователя.
Из БД выбираешь сообщения: SELECT * Where id > lastMessageId и дописываешь их в конец (таблицы, или просто графики, как уже реализуешь).
Если у тебя это document.write в Javascript работает (мне было бы интересно посмотреть хоть на саму работу этого чата) - то в Javascript можешь сохранять дату(id) последнего сообщения и при обращении к серверному скрипту (например newmessage.php) передавать эту дату: newmessage.php?last=0123456789 (last - временная метка Unix).
write / writeln - это на каком языке?
Если через Java это делать - то можно создать Thread, наверное (не знаю точно, какие там на applet ограничения есть), и в нём опрашивать БД.
В своём классе в переменной int lastMessageId хранишь последнее сообщение которое показано у пользователя.
Из БД выбираешь сообщения: SELECT * Where id > lastMessageId и дописываешь их в конец (таблицы, или просто графики, как уже реализуешь).
Если у тебя это document.write в Javascript работает (мне было бы интересно посмотреть хоть на саму работу этого чата) - то в Javascript можешь сохранять дату(id) последнего сообщения и при обращении к серверному скрипту (например newmessage.php) передавать эту дату: newmessage.php?last=0123456789 (last - временная метка Unix).
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
IUnknown, примерно как работает chat.bigmir.net можно посмотреть тут.
Насколько я знаком с чатами - демона он не использует ;-)
Если тебе действительно захочется писать чат с демоном:
1. Можешь найти уже готовые исходники и проанализировать их для начала.
2. Создашь новую тему, а то эта слишком длинной будет.
Но я действительно сомниваюсь, что это тебе нужно.
Хотя бы, у тебя есть доступ к cron таблице на хостинге?
Я не абсолютно уверен, но весьма подозреваю, что это может понадобиться.
Насколько я знаком с чатами - демона он не использует ;-)
Если тебе действительно захочется писать чат с демоном:
1. Можешь найти уже готовые исходники и проанализировать их для начала.
2. Создашь новую тему, а то эта слишком длинной будет.
Но я действительно сомниваюсь, что это тебе нужно.
Хотя бы, у тебя есть доступ к cron таблице на хостинге?
Я не абсолютно уверен, но весьма подозреваю, что это может понадобиться.
Спасибо всем за помощь (но это не значит что мне она уже не нужна). А вот на счет write то у меня он работает так: скрытый фрейм обновляется через каждые 5 секунд и в событие OnLoad пишу something.frame("msgs").writeln("load.php"); и в фрейме с сообщениями я получаю новые сообщения которые добавляются в конец старых. А вот на счет демона, то все ок - у меня есть полный доступ к серверу.
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
[quote="IUnknown"]в событии OnLoad пишу something.frame("msgs").writeln("load.php")]
Странно, мне когда-то мудрый Aik говорил, что так писать по уставу не положено :lol:
Потому будь осторожен, под отличными от IE броузерами можешь получить совершенно неожиданный результат.
Так если у тебя оно дописывает в конец - то в чём, собственно, проблема? (кстати, что значит "щёлкает" ?)
Странно, мне когда-то мудрый Aik говорил, что так писать по уставу не положено :lol:
Потому будь осторожен, под отличными от IE броузерами можешь получить совершенно неожиданный результат.
Так если у тебя оно дописывает в конец - то в чём, собственно, проблема? (кстати, что значит "щёлкает" ?)
ты, как я посмотрю, весь фрейм обновляешь, а я говорил только про ту часть, куда надо вставить новое сообщение.
пример приведу на VBScript (выдран из книги).
поиск нужного текста и замена его:
также можно использовать innerHTML:
надо сказать, что первый пример у меня сработад только в IE, второй вообще не сработал. примеры взяты из книги Стивена Хольцнера Dynamic HTML: руководство разработчика. BHV, 1999, ISBN 966-552-013-X
предлагаю перенести тему в JavaScript.
пример приведу на VBScript (выдран из книги).
поиск нужного текста и замена его:
Код: Выделить всё
<html>
<head>
<title>test</title>
</head>
<body>
<script language='VBScript'>
Sub ChangeText()
Dim r
set r = document.body.createTextRange()
r.findText("это текст")
r.pasteHTML("это новый текст")
End Sub
</script>
[align=center]
<input type='button' value='Изменить текст' onClick='ChangeText()'>
это текст
[/align]
</body>
</html>
также можно использовать innerHTML:
Код: Выделить всё
<html>
<head>
<title>test</title>
</head>
<body>
[align=center]
<h1 id='text' onClick='ChangeText()'>Это текст</h1>
<div>Изменить текст</div>
[/align]
</body>
<script language='VBScript'>
Sub ChangeText()
text.innerHTML='Новый текст'
End Sub
</script>
</html>
надо сказать, что первый пример у меня сработад только в IE, второй вообще не сработал. примеры взяты из книги Стивена Хольцнера Dynamic HTML: руководство разработчика. BHV, 1999, ISBN 966-552-013-X
предлагаю перенести тему в JavaScript.
write/writeln пробовал на IE и Opera (на опере вообще красота). Я не пойму почему эти функции обновляют весь фрейм так как они без всяких обновлений дописывают новые сообщения в конец старых (так как прокрутка не работает приходится еще после их добавления прокручивать страницу, что-бы было видно новое сообщение. А щелкание - это характерный звук который издает IE при загрузке новых даннных. Тут еще возникла идея - наткнулся в инете на скриптик(адресс не помню, но имкал по словам "непрерывная загрузка сообщений") который может динамически подкгужать данные из сервера (пример там был такой как в гугле - пишешь первые несколько букв слова и он подгружает данные совпадающие с начальными буквами - типа фильтр такой). Недостаток один - все теги должны быть заключены в тег <script></script> - нах не знаю. А с помощью innerHTML пробовал, что-то не выходит, а с write все просто тип-топ 
