Jquery... Пользователь пишет...

Тема в разделе "JavaScript", создана пользователем PhantomUA, 13 янв 2013.

Модераторы: ZiX
  1. PhantomUA

    PhantomUA Инквизитор

    Moderator
    • Супермодератор
    Регистр.:
    2 июл 2006
    Сообщения:
    759
    Симпатии:
    1.639
    Есть задача...
    Есть система отправки сообщений.. Нужно сделать чтобы в момент написания пользователем сообщения другому пользователю - в окне сообщений адресата писало: Пользователь пишет.. (Как это примерно работает в Вконтакте или Однокласниках..)
    Просьба направить в нужное русло с вариантами реализации...
     
  2. Sunday

    Sunday

    Регистр.:
    13 дек 2009
    Сообщения:
    732
    Симпатии:
    323
    Совсем недавно делал себе живой посик на сайте, используя jQuery.ajax(), думаю, что здесь его тоже можно применить.
     
  3. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Со стороны JS такое не проблема сделать. Можно использовать WebSocket (уже есть тысяча реализаций эмуляции для древних браузеров).
    То есть, нужна двухсторонняя связь браузер-сервер.
    Возможно, проблемы возникнут с программированием серверной части. Возникнут проблемы только в одном случае, если серверная часть реализуется на php. Сервер WebSocket лучше держать на вдс или дедике. Можно весь сайт сделать на пыхе, а механизм чата сделать на с++, питоне или nodejs.
     
  4. PhantomUA

    PhantomUA Инквизитор

    Moderator
    • Супермодератор
    Регистр.:
    2 июл 2006
    Сообщения:
    759
    Симпатии:
    1.639
    Да но...
    От чего отталкиватся и какие запросы передавать и проверять пишет ли сообщение чтобы другому показывать... Понятно что привязыватся к ид пользователя одного и второго и делать проверки.. но пока все туманно это представляю...

    Весь сайт как раз на пыхе.. и в нем просто доделывается система сообщений...
    Если возможность это сделать просто на jquery без дополнительной реализации сервера на чем-то другом типа nodejs или подобном.. С этим просто не сталкивался..
     
  5. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    Ну WebSocket-сервер должен быть запущен всегда, круглосуточно. Браузер держит связь через WebSocket c сервером. Сервер в любую секунду может послать данные о новом сообщении или о том, что кто-то начал печатать.

    А PHP-скрипт запускается когда пользователь начинает загружать страничку, и завершает работу когда закончил генерацию странички. Ну если не сделать вменяемого сервера на WebSocket, можно не мечтать что это будет работать также быстро как на вконтакте или одноклассниках. То есть браузер через аякс раз в 10-30 секунд будет отправлять запрос серверу, а не пришли ли новые сообщения. В случае с WebSocket-сервером, у сервера есть возможность отправлять данные браузеру моментально, когда надо.
     
  6. PhantomUA

    PhantomUA Инквизитор

    Moderator
    • Супермодератор
    Регистр.:
    2 июл 2006
    Сообщения:
    759
    Симпатии:
    1.639
    это уже сделано и вполне устраивает опрос раз в 10 секунд.... интересует именно момент реализации: "Пользователь пишет"...
     
  7. recasher2k12

    recasher2k12

    Регистр.:
    19 фев 2012
    Сообщения:
    156
    Симпатии:
    78
    В таком случае следует сделать надпись "пользователь пишет" также, как и новое сообщение. Для этого в скрипт нужно добавить всего-лишь обработчик .on('keypress', function(){ .. });
    С клиента отсылающего сообщение, можно отправить частный вид сообщения, например, содержание которого будет "пользователь пишет". На клиенте принимающем сообщение добавить условие
    Код:
    if(message == 'пользователь пишет') {
      $('#writing').show();
    } else {
      $('#messagelog').append(message);
    }
    Далее, если все устраивает, нужно добавить другой вид частного сообщения "пользователь перестал писать":
    Код:
    if(message == 'пользователь пишет') {
      $('#writing').show();
    } else if(message == 'пользователь перестал писать') {
      $('#writing').hide();
    } else {
      $('#messagelog').append(message);
    }
    Ну а на отправляющей части можно заранее создать setTimeout(), который отсылает сообщение, что пользователь уже ничего не набирает. Если происходит новый набор сообщения, удалить таумаут функцией clearTimeout() и создать новый setTimeout().
     
    latteo и PhantomUA нравится это.