|
|
|
| Всем привет!
Рефреш на 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;
}
}
});
}
|
но не работает ессно... подскажите как это сделать правильно? | |
|
|
|
|
|
|
|
для: Sharax
(09.10.2014 в 02:41)
| | А где объява last_data вне success?
Вот, делал как-то давным-давно: http://deed.net.ua/down/stream2.rar - исходники открыты, можно посмотреть. | |
|
|
|
|
|
|
|
для: Deed
(09.10.2014 в 07:38)
| | объявил пустую last_data вне success но ничего не изменилось | |
|
|
|
|
|
|
|
для: 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" - не делаем ничего, в противном случае - остальное. | |
|
|
|
|
|
|
|
для: Sharax
(09.10.2014 в 02:41)
| | var - это объявление локальной переменной, а у вас получается, что есть обращение к ней и только затем объявление.
А вообще, клиент в такой задаче ничего проверять не должен касаемо есть ли новое, это должен делать сервер - если за период времени равном времени запроса минус 0,5 сек (слишком малое время, кстати), нет записей в базе, значит возвращается null, иначе данные, которые или добавляются клиентом к существующим, или заменяют существующие. | |
|
|
|
|
|
|
|
для: confirm
(09.10.2014 в 07:45)
| | т.е. проверять например кол-во строк файла с тем кол-вом которое было посчитано полсекунды назад?
я просто думаю в плане нагрузки на хостинг... js то на стороне клиента работает в его оперативки там без разницы какие проверки и как часто, но php то у меня ведь.. | |
|
|
|
|
|
|
|
для: Sharax
(09.10.2014 в 12:15)
| | А вы откуда можете знать какими ресурсами располагает система клиента? Каким бы ни был компьютер клиента, валить его всяким никчемным не стоит. И вообще - клиентские скрипты, работа с базой, это кратковременная задача направленная на быстрый отклик, и она во многом зависит от вас, а не от возможностей сервера - при корявых скриптах можно завалить сервер обладающий и уймой ресурсов. А работа на клиенте, это постоянная задача, причем может быть несколько задач асинхронных, которые выполняются в реальном режиме времени, и не понимать этого, считая что компьютер клиента все сдюжит, это из рук вон плохо.
А вот запросами через каждые 0,5 сек вы свой сервер завалить можете, ну не один же чатится у вас, и найдите человека, который бы с такой скоростью в чате писал ответы. Найдете? Вряд ли, так к чему такая поспешность? | |
|
|
|
|
|
|
|
для: confirm
(09.10.2014 в 12:38)
| | Если в чате общается более 15 человек одновременно, то при меньшем времени обновления будет сообщения выкидывать пачками по не сколько штук. | |
|
|
|
|
|
|
|
для: Sharax
(09.10.2014 в 12:55)
| | А вы групповой чат пишите?
Тем более нужно время чтобы даже просто сделать выборку, проанализировать, подготовить ее к выдаче и выдать, а вы еще с периодом пол секунды хотите третировать сервер.
И что, если придет сразу несколько новых сообщений, проблема поместить их на страницу или это смертельно?
У вас и клиент к черту закиснет, ибо может просто не дождаться отклика сервера, ваш чат же не под локальным сервером работать будет, где все чехом, а в реальной сети, а там только открытие соединения может задержаться по тем или иным причинам. | |
|
|
|
|
|
|
|
для: confirm
(09.10.2014 в 13:01)
| | Со временем обновления я согласен, поставил больше. 2,5 сек
Вообще проверку на новое сообщение я решил делать только для того, чтобы когда пользователь чата просматривает (скроллингом вверх) историю переписки в чате, чтобы scrollTop не мешал
Я подумал, может быть рациональнее будет сделать проверку, что если скролл у div в самом низу тогда докручиваем его в самый низ с каждым вызовом ф-ии обновления, если скролл не в самом низу, то его не трогаем. | |
|
|
|
|
|
|
|
для: Sharax
(10.10.2014 в 01:06)
| | Сейчас такой вопрос возник, как узнать максимальное значение scrollTop() ?
Т.е.
$('#chatwin').scrollTop() - текущая позиция скролла
$('#chatwin').scrollHeight() - высота div
мне нужно узнать максимально возможное значение $('#chatwin').scrollTop() для того, чтобы я мог сравнить его с текущим значением скролла и если разница менее 30px то скролл опускать, в противном случае его не трогать.
Тогда получится что если пользователь читает предидущие сообщения, то скроллинг не дергается вниз, если он его опускает до самого низа, то скролл снова начинает работать.
В общем как узнать возможный максимум $('#chatwin').scrollTop()? | |
|
|
|
|
|
|
|
для: Sharax
(10.10.2014 в 01:06)
| | . | |
|
|
|
|
|
|
|
для: Sharax
(10.10.2014 в 01:06)
| | >Вообще проверку на новое сообщение я решил делать только для того, чтобы когда пользователь чата просматривает (скроллингом вверх) историю переписки в чате, чтобы scrollTop не мешал
Оригинально. А каким образом тогда вообще эта история появляется? Да и вообще зачем запрашивать - загрузили то что было, и пусть крутит, ничего мешать не будет.
Какое отношение может иметь скроллингг объекта к событиям на на сервере, которые протекают вне ведома клиента? По барабану какой на клиенте скроллинг, пока он не обратиться к серверу с вопросом есть ли новое, он не узнает ответа на это.
Не выдумывайте граблей - запрос не для того, чтобы что-то не мешало, а именно для того, чтобы знать ответ. И 2,5 секунд это уж как посмотреть, не смертельно было бы и 5, а может и больше.
Как вы вообще себе представляете чат? Если гребсти все, то можно ли понять о чем это все? А если групповой, то только те кто участвуют в группе. А это означает, что и за час может ничего не быть нового, а может и пачка целая, а это неизбежно прокрутка, хотите вы этого или нет. А по разумному, так разделите окно чата на две части, если уж так охота что-то прокручивать и новое не мешало. В одну часть приходит новое, которое автоматом позиционируется на первое сообщение, другая часть это история. Прокрутили новое, прочли его значит, после чего таймером (по новому поступлению) перемещается в историю.
Вот такие задачи, это да, это задачи клиента. А есть ли новое, это не задача клиента, это задача сервера, и не по скроллу, это вообще уму не постижимо, ибо он может вечно быть вверху оставленным пользователем, но при этом на сервере будет куча новых сообщений. | |
|
|
|
|
|
|
|
для: confirm
(10.10.2014 в 01:42)
| | вы меня немного не поняли, сообщения в любом случае в div новые приходят, только от положения текущего скролла должно зависеть опускается скролл к последнему сообщению или нет
чат с двуя окнами в одной сообщения в другом история возможен, но для чего, если чтобы реализовать первое мне достаточно узнать максимальную высоту scrollTop, но как это сделать я пока не знаю и пытаюсь узнать на этом форуме | |
|
|
|
|
|
|
|
для: Sharax
(10.10.2014 в 02:24)
| | Здесь описан метод
При получении нового в любом случае надо переместить пользователя к новому, иначе как же он поймет, что появилось новое? Вот этого я точно не понимаю. | |
|
|
|
|
|
|
|
для: confirm
(10.10.2014 в 02:41)
| | я не знаю как перефразировать свой вопрос чтобы было понятно ))
есть div с вертикальным скроллом, scrollTop определяет текущее положение скролла, если его опустить в самый низ, то он предположим будет иметь значение 1320 если его поднять на середину, то его значение будет 660. Так вот, вопрос состоит в том, какой функцией (без разницы jq или js) можно получить цифру 1320 в тот момент, когда скролл находится на середине или в начале или в любом другом месте, но не в конце (не в самом низу)??? | |
|
|
|
|
|
|
|
для: Sharax
(10.10.2014 в 04:00)
| | Нет такой функции, которая бы "говорила" что прокрутка в середине, для этого надо получать ее текущее положение (ссылку на метод для этого я вам и дал), и далее проводить расчет, дабы узнать. Самое верхнее это 0, рассчитывать ничего не надо.
Для того чтобы отслеживать перемещение, нужно отслеживать соответствующее событие, для прокрутки в JQ это scroll(). Вот в обработчике этого события и рассчитывайте положение прокрутки и делайте чего вам надо.
Для не знаю чего вам считать, но скорее всего потребуются другие параметры окна прокручиваемого. Все что нужно можно найти все по той же ссылке, что я давал. | |
|
|
|
|
|
|
|
для: Sharax
(10.10.2014 в 04:00)
| |
var objDiv = document.getElementById("your_div");
objDiv.scrollTop = objDiv.scrollHeight;
|
| |
|
|
|
|