Ajax для чата
Ajax для чата
В БД должно храниться всегда ровно 20 сообщений чата.
Мне нужно что бы при отправке сообщения, оно появлялось, а старое удалялось, без перезагрузки страницы.
Т.е. как я представляю, нужен скрипт, который должен дёргать страницу каждые 2 сек, и делать проверку на новые сообщения.
Может есть какой то класс, который сможет мне помочь в этом?
Мне нужно что бы при отправке сообщения, оно появлялось, а старое удалялось, без перезагрузки страницы.
Т.е. как я представляю, нужен скрипт, который должен дёргать страницу каждые 2 сек, и делать проверку на новые сообщения.
Может есть какой то класс, который сможет мне помочь в этом?
Re: Ajax для чата
А мне нужен клон яндекса, может у кого есть готовый класс? Задача элементарная. В одном экшене выводишь 20 актуальных сообщений, в другом сам чат, js функция, которая получает эти сообщения и вставляет в блок и все это в setInterval
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Ajax для чата
PS: где-то читал, что лучше setInterval заменять на setTimeout, где это возможно
Жду Yii 3!
- timlar
- Сообщения: 1382
- Зарегистрирован: 2009.09.19, 17:49
- Откуда: Украина, Днепропетровск
- Контактная информация:
Re: Ajax для чата
Это зависит от ситуации. Разница между ними в том, что setTimeout() выполняет функцию один раз, а setInterval() многократно. И как раз таки лучше использовать setInterval(), дабы не вызывать setTimeout() внутри функции.mc-bear писал(а):PS: где-то читал, что лучше setInterval заменять на setTimeout, где это возможно
Twitter: @timlar_ua
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Ajax для чата
Я знаю разницу мду этими функциями. Надо учесть что setInterval четко через определенное время. Что может создать проблемы. Если выполнения функции займет больше времени чем задан интервал, что произойдет? Имхо намного удобнее ставить таймаут, при котором удалять старый и ставить новый. Но это субъективное мнение, и вообще не по теме
Жду Yii 3!
Re: Ajax для чата
long pulling
Клиент после заполнения 20 коментов открывает соединение c запросом на получение новых коментов и ждет ответ. Ожидает он не последний новый комментарий, а все 20 для синхронизации. Сервер же отвечает только при добавлении кем то нового комментария и закрывает соединение. Можно использовать веб сокеты и 2-й XMLHttpRequest и не закрывать соединение.
PS: NodeJs идеально подходит.
Без setInterval и timeout.
Клиент после заполнения 20 коментов открывает соединение c запросом на получение новых коментов и ждет ответ. Ожидает он не последний новый комментарий, а все 20 для синхронизации. Сервер же отвечает только при добавлении кем то нового комментария и закрывает соединение. Можно использовать веб сокеты и 2-й XMLHttpRequest и не закрывать соединение.
PS: NodeJs идеально подходит.
Без setInterval и timeout.
Re: Ajax для чата
Ты его прошлые темы почитай, это явно не для него, то , что я описал оптимальный вариант. Так-то да, можно Comet например заюзать.BuCeFaL писал(а):long pulling
Клиент после заполнения 20 коментов открывает соединение c запросом на получение новых коментов и ждет ответ. Ожидает он не последний новый комментарий, а все 20 для синхронизации. Сервер же отвечает только при добавлении кем то нового комментария и закрывает соединение. Можно использовать веб сокеты и 2-й XMLHttpRequest и не закрывать соединение.
PS: NodeJs идеально подходит.
Без setInterval и timeout.
- timlar
- Сообщения: 1382
- Зарегистрирован: 2009.09.19, 17:49
- Откуда: Украина, Днепропетровск
- Контактная информация:
Re: Ajax для чата
Поэтому я и написал, что зависит от ситуацииmc-bear писал(а):Но это субъективное мнение, и вообще не по теме
Twitter: @timlar_ua
Re: Ajax для чата
Скрипт:
Контроллер:
Вьюха:
Код работает, в плане всего, кроме вызова методов контролёра. Что я не правильно делаю?
Код: Выделить всё
<script type="text/javascript">
$(document).ready(function(){
$('#message-form').submit(Send);
$('#text-message').focus();
setInterval("chat/index", 2000);
$('.left-content').scrollTop($('.left-content').get(0).scrollHeight);
});
function Send(){
$.post('chat/index', {
text_message: $('#text-message').val(),
ajax: 'send'
}, Load);
$('#text-message').val('');
$('#text-message').focus();
return false;
}
var load_in_process = false;
function Load(){
if(!load_in_process){
load_in_process = true;
$.post('chat/index',{
ajax: 'load'
},
function(result){
eval(result);
$('.left-content').scrollTop($('.left-content').get(0).scrollHeight);
load_in_process = false;
});
}
}
</script>
Код: Выделить всё
<?php
class ChatController extends CController{
public function actionIndex(){
switch($_POST['ajax']){
case 'send':
$this->actionMessage();
break;
case 'load':
$this->actionView();
break;
default:
$this->actionView();
}
}
public function actionView(){
$criteria = new CDbCriteria(array(
'order' => 'id_message DESC',
'limit' => '50',
));
$model = Chat::model()->findAll($criteria);
$model = array_reverse($model);
$this->render('index', array(
'models' => $model,
));
}
public function actionMessage(){
$model = new Chat;
$model->text_message = $_POST['message'];
}
}
Код: Выделить всё
<form action="" method="post" id="message-form">
<textarea name="message" class="input-text" cols="62" rows="4" id="text-message"></textarea>
<input type="submit" name="submit" class="input-button" value="Отправить" />
</form>