Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: jq чат вопрос
 
 автор: Sharax   (09.10.2014 в 02:41)   письмо автору
 
 

Всем привет!
Рефреш на jquery по setinterval


function refresh() { 
  var $chatwin = $("#chatwin");  
  $.ajax({ 
    type: "POST", 
    data: { 
      "what": "refresh"
    }, 
    dataType: "html", 
    url: "refresh.php",  
    success: function(data) { 
    $chatwin.html(data);
    document.getElementById("chatwin").scrollTop = 9999;       
    }
  }); 



Рефрешится каждые 0,5 сек., решил сделать проверку на новые сообщения следующей проверкой:


function refresh() { 
  var $chatwin = $("#chatwin");  
  $.ajax({ 
    type: "POST", 
    data: { 
      "what": "refresh"
    }, 
    dataType: "html", 
    url: "refresh.php",  
    success: function(data) { 
    if (last_data != data)
               {
               $chatwin.html(data);
               document.getElementById("chatwin").scrollTop = 9999;
               var last_data = data;
               }
    }
  }); 



но не работает ессно... подскажите как это сделать правильно?

  Ответить  
 
 автор: Deed   (09.10.2014 в 07:38)   письмо автору
 
   для: Sharax   (09.10.2014 в 02:41)
 

А где объява last_data вне success?
Вот, делал как-то давным-давно: http://deed.net.ua/down/stream2.rar - исходники открыты, можно посмотреть.

  Ответить  
 
 автор: Sharax   (09.10.2014 в 12:13)   письмо автору
 
   для: Deed   (09.10.2014 в 07:38)
 

объявил пустую last_data вне success но ничего не изменилось

  Ответить  
 
 автор: Deed   (09.10.2014 в 19:59)   письмо автору
 
   для: Sharax   (09.10.2014 в 12:13)
 

Ладно, попытаюсь объяснить "на пальцах". УПРОЩЕННО.
В last_data нужно помещать html блока, содержащего чат. А в success: function(data) - отформатированную выборку из базы (в переменной data). И, если содержимое этих переменных идентично, ничего не делаем. В противном случае "переписываем" html блока с чатом.
Но это - фигня. Громоздкая фигня.
Нужно не переписывать все содержимое чата и не гонять его туда-сюда между сервером и клиентом, а, к примеру, передавать на сервер id последней реплики, на сервере проверять, появилась ли в базе запись с id, большим чем в чате. Если нет, то ничего не делаем, если да, то выводим ТОЛЬКО ПОСЛЕДНИЕ РЕПЛИКИ, ДОБАВЛЯЯ ИХ в конец чата.
Поэтому, не нужно сравнивать эти две переменные (last_data & data), а нужно проверять, что возвращает обращение к файлу refresh.php - пропишите в нем, в случае отсутствия новых записей, к примеру, echo "empty", то есть, если в data будет "empty" - не делаем ничего, в противном случае - остальное.

  Ответить  
 
 автор: confirm   (09.10.2014 в 07:45)   письмо автору
 
   для: Sharax   (09.10.2014 в 02:41)
 

var - это объявление локальной переменной, а у вас получается, что есть обращение к ней и только затем объявление.

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

  Ответить  
 
 автор: Sharax   (09.10.2014 в 12:15)   письмо автору
 
   для: confirm   (09.10.2014 в 07:45)
 

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

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

  Ответить  
 
 автор: confirm   (09.10.2014 в 12:38)   письмо автору
 
   для: Sharax   (09.10.2014 в 12:15)
 

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

А вот запросами через каждые 0,5 сек вы свой сервер завалить можете, ну не один же чатится у вас, и найдите человека, который бы с такой скоростью в чате писал ответы. Найдете? Вряд ли, так к чему такая поспешность?

  Ответить  
 
 автор: Sharax   (09.10.2014 в 12:55)   письмо автору
 
   для: confirm   (09.10.2014 в 12:38)
 

Если в чате общается более 15 человек одновременно, то при меньшем времени обновления будет сообщения выкидывать пачками по не сколько штук.

  Ответить  
 
 автор: confirm   (09.10.2014 в 13:01)   письмо автору
 
   для: Sharax   (09.10.2014 в 12:55)
 

А вы групповой чат пишите?

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

И что, если придет сразу несколько новых сообщений, проблема поместить их на страницу или это смертельно?

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

  Ответить  
 
 автор: Sharax   (10.10.2014 в 01:06)   письмо автору
 
   для: confirm   (09.10.2014 в 13:01)
 

Со временем обновления я согласен, поставил больше. 2,5 сек
Вообще проверку на новое сообщение я решил делать только для того, чтобы когда пользователь чата просматривает (скроллингом вверх) историю переписки в чате, чтобы scrollTop не мешал
Я подумал, может быть рациональнее будет сделать проверку, что если скролл у div в самом низу тогда докручиваем его в самый низ с каждым вызовом ф-ии обновления, если скролл не в самом низу, то его не трогаем.

  Ответить  
 
 автор: Sharax   (10.10.2014 в 01:41)   письмо автору
 
   для: Sharax   (10.10.2014 в 01:06)
 

Сейчас такой вопрос возник, как узнать максимальное значение scrollTop() ?
Т.е.
$('#chatwin').scrollTop() - текущая позиция скролла
$('#chatwin').scrollHeight() - высота div
мне нужно узнать максимально возможное значение $('#chatwin').scrollTop() для того, чтобы я мог сравнить его с текущим значением скролла и если разница менее 30px то скролл опускать, в противном случае его не трогать.

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

В общем как узнать возможный максимум $('#chatwin').scrollTop()?

  Ответить  
 
 автор: Sharax   (10.10.2014 в 01:41)   письмо автору
 
   для: Sharax   (10.10.2014 в 01:06)
 

.

  Ответить  
 
 автор: confirm   (10.10.2014 в 01:42)   письмо автору
 
   для: Sharax   (10.10.2014 в 01:06)
 

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

Оригинально. А каким образом тогда вообще эта история появляется? Да и вообще зачем запрашивать - загрузили то что было, и пусть крутит, ничего мешать не будет.

Какое отношение может иметь скроллингг объекта к событиям на на сервере, которые протекают вне ведома клиента? По барабану какой на клиенте скроллинг, пока он не обратиться к серверу с вопросом есть ли новое, он не узнает ответа на это.

Не выдумывайте граблей - запрос не для того, чтобы что-то не мешало, а именно для того, чтобы знать ответ. И 2,5 секунд это уж как посмотреть, не смертельно было бы и 5, а может и больше.

Как вы вообще себе представляете чат? Если гребсти все, то можно ли понять о чем это все? А если групповой, то только те кто участвуют в группе. А это означает, что и за час может ничего не быть нового, а может и пачка целая, а это неизбежно прокрутка, хотите вы этого или нет. А по разумному, так разделите окно чата на две части, если уж так охота что-то прокручивать и новое не мешало. В одну часть приходит новое, которое автоматом позиционируется на первое сообщение, другая часть это история. Прокрутили новое, прочли его значит, после чего таймером (по новому поступлению) перемещается в историю.

Вот такие задачи, это да, это задачи клиента. А есть ли новое, это не задача клиента, это задача сервера, и не по скроллу, это вообще уму не постижимо, ибо он может вечно быть вверху оставленным пользователем, но при этом на сервере будет куча новых сообщений.

  Ответить  
 
 автор: Sharax   (10.10.2014 в 02:24)   письмо автору
 
   для: confirm   (10.10.2014 в 01:42)
 

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

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

  Ответить  
 
 автор: confirm   (10.10.2014 в 02:41)   письмо автору
 
   для: Sharax   (10.10.2014 в 02:24)
 

Здесь описан метод

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

  Ответить  
 
 автор: Sharax   (10.10.2014 в 04:00)   письмо автору
 
   для: confirm   (10.10.2014 в 02:41)
 

я не знаю как перефразировать свой вопрос чтобы было понятно ))
есть div с вертикальным скроллом, scrollTop определяет текущее положение скролла, если его опустить в самый низ, то он предположим будет иметь значение 1320 если его поднять на середину, то его значение будет 660. Так вот, вопрос состоит в том, какой функцией (без разницы jq или js) можно получить цифру 1320 в тот момент, когда скролл находится на середине или в начале или в любом другом месте, но не в конце (не в самом низу)???

  Ответить  
 
 автор: confirm   (10.10.2014 в 04:46)   письмо автору
 
   для: Sharax   (10.10.2014 в 04:00)
 

Нет такой функции, которая бы "говорила" что прокрутка в середине, для этого надо получать ее текущее положение (ссылку на метод для этого я вам и дал), и далее проводить расчет, дабы узнать. Самое верхнее это 0, рассчитывать ничего не надо.

Для того чтобы отслеживать перемещение, нужно отслеживать соответствующее событие, для прокрутки в JQ это scroll(). Вот в обработчике этого события и рассчитывайте положение прокрутки и делайте чего вам надо.

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

  Ответить  
 
 автор: Deed   (10.10.2014 в 08:04)   письмо автору
 
   для: Sharax   (10.10.2014 в 04:00)
 


var objDiv = document.getElementById("your_div");
objDiv.scrollTop = objDiv.scrollHeight;

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования