[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Визуальное "удобство" чата
malek
привет.
в работе своего чата заметил оплошность - после обновления сообщений при наличии в них подгружаемых картинок, возникает "передергивание" фрейма с сообщениями и фокус остается на последней картинке, а не внизу формы, как я указываю функцией прокрутки.

это неудобно, т.к. придется "докручивать" scroll формы вручную мышкой.

как я понимаю, происходит такая оплошность из-за того, что картинки не успевают полностью загрузиться во фрейм (расположены на других доменах)
а я принудительно выполняю scroll, если нахожу на сервере более поздние сообщения. здесь происходит конфликт: прокрутка выполняется, а затем происходит дозагрузка картинок, фокус уходит вверх.

т.о. у меня возникла идея повесить scroll только на событие полной загрузки формы (в моем случае - все грузиться по id в div-блок)

Вопрос: как реализовать привязку к div события полной загрузки контента с картинками?

спасибо










Спустя 23 минуты, 51 секунда (4.11.2010 - 12:58) sergeiss написал(а):
Переместил тему в JavaScript.

По теме: попробуй использовать событие onload для body (хотя я не уверен на 100%, что это поможет в данной ситуации).

Спустя 44 минуты, 59 секунд (4.11.2010 - 13:43) malek написал(а):
sergeiss
действительно, onload для body (также как и для iframe) не поможет

так событие наступает один раз при начальной загрузке фрейма. далее, управление подгрузкой сообщений происходит при помощи яваскрипта

он сравнивает текст, добавляет к уже выведенному то, что пришло:

мой фрейм.document.getElementById('мой div-блок').innerHTML += новый текст

как видно из примера, событие onload для body, iframe - не произойдет)

проблема наверняка пустяковая, просто у меня уже ступор))))

Спустя 16 минут, 46 секунд (4.11.2010 - 14:00) ZSH написал(а):
onload для img ?

Спустя 2 часа, 11 минут, 39 секунд (4.11.2010 - 16:12) malek написал(а):
onload для img ?

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

Спустя 2 часа, 58 минут, 12 секунд (4.11.2010 - 19:10) sergeiss написал(а):
Цитата (malek @ 4.11.2010 - 17:12)
неизвестно сколько будет картинок))) может и не быть ни одной

А в процессе загрузки страницы, в самом начале, ты можешь это количество узнать? Как-то же ведь оно определяется?

Тогда надо установить некий счетчик равным количеству картинок, которые должны быть загружены, а в onload каждой картинки уменьшать счетчик на 1. Когда счетчик станет равен 0 - все картинки загружены. Либо их не было вообще smile.gif, что не суть важно.

Спустя 31 минута, 3 секунды (4.11.2010 - 19:41) malek написал(а):
Цитата
А в процессе загрузки страницы, в самом начале, ты можешь это количество узнать? Как-то же ведь оно определяется?


нет, это очень громоздко.
если только лепить в конце (к последнему сообщению) скрытое однопиксельное изображение с обработчиком скрола. но это опять же - громоздко

пока не соображу...

Спустя 22 минуты, 48 секунд (4.11.2010 - 20:04) sergeiss написал(а):
Что именно "громоздко"???

Спустя 25 минут, 16 секунд (4.11.2010 - 20:29) malek написал(а):
sergeiss
громоздко то, что сообщения с картинками попадают в контент по-очереди, наполняют его. мне надо выдирать его полностью и анализировать на наличие картинок.

это громоздко, так как придется делать на каждом клиентском месте

Спустя 17 минут, 53 секунды (4.11.2010 - 20:47) sergeiss написал(а):
Цитата (malek @ 4.11.2010 - 21:29)
это громоздко, так как придется делать на каждом клиентском месте

Не понял эту фразу... Да и предыдущая тоже не понятна.

Опиши немного подробнее (и понятнее), вместе подумаем, как реализовать.

Спустя 1 минута, 51 секунда (4.11.2010 - 20:49) Игорь_Vasinsky написал(а):
а если создать в кнце фрейма анкор (ещё анкор) <a name="#end_frame"></a>

а вместо релоад - делать Location.href="frame.php#end_frame";

мож так сработает....

тоесть нужно конечно не на фрейм отправлять, а на страницу с фреймом, но меткой из фрейма....

Спустя 1 час, 1 минута, 2 секунды (4.11.2010 - 21:50) malek написал(а):
Игорь_Vasinsky
проблемка в том, это чат

весь рефреш я спрятал от пользователя по ставшей классической схеме с фреймами
то есть обновляются только фреймы (кто в чате и сообщения)

чтобы не пугать дергаюшимися окнами пришлось добавлять контент фрейма сообщений через яваскрипт и посылать заголовком.

далее:
пользователь считывает с сервера сообщение, которое позже последнего, находящегося на локальной машине

если такое имеется - считываем его и прибавляем к контенту, заключенному в элемент фрейма (div-блок)

по такой схеме все красиво и не дергается.
когда сделал автоматом распознавание картинок, обнаружил, что
скрол (я его делаю только при поступлении нового сообщения) - работает, затем догружается какая-нибудь картинка с удаленного сервера и.... фокус остается на ней

тоесть сначала страница правильно идет вниз. показывая последнее сообщение, потом несколько прыгает вверх и замирает

вот такая фигня...



Спустя 29 минут, 16 секунд (4.11.2010 - 22:19) Игорь_Vasinsky написал(а):
а откуда там картинка берётся?

Спустя 47 минут, 8 секунд (4.11.2010 - 23:06) malek написал(а):
Цитата
а откуда там картинка берётся?


???
пользователь добавляет ссылку в текст сообщения
http://hdhdhdhd.hd/kartinka.jpg

она обрабатывается, записывается в таблицу БД в виде <img src=...>

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

Спустя 19 минут, 13 секунд (4.11.2010 - 23:25) sergeiss написал(а):
Цитата (malek @ 5.11.2010 - 00:06)
она обрабатывается, записывается в таблицу БД в виде <img src=...>

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

Не совсем понятно, зачем в таком виде писать в БД, а не просто адрес картинки??? Знаки '<img' и многие другие зря место занимают. Ну, это было так, "лирическое отступление" smile.gif

А самое главное, что ты наконец-то ответил на мой вопрос!

Итак, смотрим на алгоритм. Вот ты формируешь страницу, делаешь выборку из БД... Ты в этот момент, еще до формирования страницы, можешь оценить количестов картинок юзеров, которые ты будешь показывать на этой странице? Я так "подозреваю" smile.gif, что можешь. Так что же тебе мешает сделать так, как я сказал?
Где-то в начале страницы создаешь JS переменную (через ПХП её записываешь!!!), куда записываешь количество картинок, загрузку которых нужно проконтролировать (а дальше всё в JS делается, на клиентской стороне).
К каждой из них добавляешь обработчик onload, в котором уменьшаешь эту переменную на единицу.
И делаешь таймер, который контролирует величину данной переменной. Как только она стала равна нулю, то можешь делать скроллинг.
Если переменная изначально равна нулю... То скроллинг будет сделан сразу smile.gif

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

Спустя 25 минут, 28 секунд (4.11.2010 - 23:51) malek написал(а):
sergeiss
я кажется понял твою идею теперь, много вопросов. буду разбираться, но уже завтра.

спасибо что откликнулся)))

Спустя 9 часов, 24 минуты, 17 секунд (5.11.2010 - 09:15) malek написал(а):
во время всего этого разбора, неожиданно пришел к простой мысли:

скрол надо выполнять только при первом входе в чат, по схеме предложенной sergeiss, а потом воспроизводить какой-нибудь звук по приходу новых сообщений. этот звук укажет пользователю, что надо прокрутить и посмотреть)))

пользователь может читать текст и принудительное выполнение скролла будет его раздражать)))

звуки еще сам не подключал, но думаю воспользоваться <embed>, вызывая его яваскриптом и изменяя свойства активности

Спустя 3 часа, 12 минут, 10 секунд (5.11.2010 - 12:27) malek написал(а):
сделал все по схеме выше, работает))) ура! sergeiss

но звук через <embed> идет только в IE
mozilla, safari не понимают и требуют плагины(((

неужели нельзя проиграть звук по условию (приход нового сообщения) без загрузки в браузеры плагинов?
что то мне не вериться? кто нибудь знает простое решение?
спасибо





Спустя 1 час, 4 минуты, 14 секунд (5.11.2010 - 13:32) sergeiss написал(а):
Цитата (malek @ 5.11.2010 - 13:27)
сделал все по схеме выше, работает)))

Поздравляю! smile.gif

А насчет звука... Насчет звука не скажу. Но учти, что звук может быть и выключен у человека. Мало ли, по какой причине... Поэтому надо сделать, наверное, еще и визуальное оповещение. Где-то что-то чтобы "моргало" при получении чего-то нового. Чтобы одновременно с включением звука начинало моргать. Тогда юзер точно будет извещён.

Спустя 4 часа, 1 минута, 28 секунд (5.11.2010 - 17:33) malek написал(а):
Цитата
А насчет звука... Насчет звука не скажу. Но учти, что звук может быть и выключен у человека. Мало ли, по какой причине... Поэтому надо сделать, наверное, еще и визуальное оповещение. Где-то что-то чтобы "моргало" при получении чего-то нового. Чтобы одновременно с включением звука начинало моргать. Тогда юзер точно будет извещён.


согласен, дельная мысль))

звук обыграл через еще и через <bgsound id="sound"> где сам звуковой файл подгружаю в момент прихода нового сообщения

но итог один - работает только в IE

у кого еще спросить можно?

Спустя 2 часа, 58 минут (5.11.2010 - 20:31) malek написал(а):
победил и звук))) кому интересно, спрашивайте

Спустя 6 часов, 10 минут, 8 секунд (6.11.2010 - 02:41) FatCat написал(а):
Цитата (malek @ 5.11.2010 - 21:31)
победил и звук

И как победил, чтобы в ИЕ не хрюкал, и лиса не воняла?
И какой формат звука? Миды удается?

Я пока пользуюсь заплаткой:
				if(stristr($_SERVER['HTTP_USER_AGENT'],"MSIE"))
{
$snd_you = '<bgsound src="sounds/you.mid" loop="1" balance="0" volume="0">';
$snd_msg = '<bgsound src="sounds/msg.mid" loop="1" balance="0" volume="0">';
}
else
{
$snd_you = '<embed src="sounds/you.mid" autostart="true" hidden="true" />';
$snd_msg = '<embed src="sounds/msg.mid" autostart="true" hidden="true" />';
}

Спустя 8 часов, 14 минут, 45 секунд (6.11.2010 - 10:56) malek написал(а):
Цитата
Я пока пользуюсь заплаткой:


такая заплатка не прокатит)) не везде идет, <embed> например в лисе требует плагин установить (и только так!), зачем людей этим пугать?
тем более, что закачивать станет quicktime, а это траффик лишний...

тему со звуком изучал 2 дня, раньше никогда не задумывался что такое разночтение в браузерах. выход для себя нашел такой:
как известно, все новые версии браузеров поддерживают флеш, я хоть и не сторонник использовать эту технологию, но здесь выкрутился ТОЛЬКО с ее помощью

указал <div id="sound"> на основной странице, а в скрипте по выполнению нужного условия передаю звук в виде пустой маленькой картинки с нужной "озвучкой" вот так

document.getElementById('sound').innerHTML ="<embed src=1.swf width=0px height=0px>"


работает везде, проверено)) плагинов не просит

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.