[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Онлайн чат
N0ob
Всем привет! Пишу онлайн чат. Примерно такой код:
function getMessages ()
{
$.ajax({
url : "messages.php",
type : "POST",
async : true,
dataType : "json",
success : function(data)
{
//Выводим сообщение
setTimeout(getMessages, 1000);
},
error : function (jq, a)
{
log("Ошибка при выборке сообщений: "+jq.responseText);
}
}
);
}

setTimeout(getMessages, 1000);

Обработчик выдает непрочитанные письма. Структура таблицы с сообщениями такая:
Цитата
id | from | to | text | date | dialog_id | view | notified

То есть обработчик выбирает сообщение, у которых view и notified равно нулю. Поле view это индикатор того, что сообщение прочитали, а notified индикатор того, что пользователя уведомили о сообщении. Как в ВК. Если ты не на странице переписки или не открыт диалог с перепиской, то в нижнем левом углу вылезет оповещение о новом сообщении с его содержимым. Со всем этим у меня проблем нет. Проблема вот в чем. Вот я выбрал сообщение. Поле notified можно обновлять на 1(то есть уведомил) сразу в обработчике, т.к. даже если пользователь не на странице переписки ему все равно выдадут алерт о сообщении ну а если на странице, то этого алерта не будет а просто вставим сообщение от юезра. Но как обновить поле view грамотна? В обработчике не получиться, т.к. пользователь может его не прочитать а отправителю покажет, что он его прочитал. Был вариант прям в функции выборке(в самом верху которая) при удачном выборе сообщения, посылать еще один запрос на сервер, но уже с обновлением поля view на 1(прочитано), если это страница переписки, открыть диалог с автором сообщения. Но будет ли это разумным решением в данном случае? Есть другие варианты?
Zuenf
Твой вариант вполне рационален.
Примерно так:
function getMessages ()
{
$.ajax({
url : "messages.php",
type : "POST",
async : true,
dataType : "json",
success : function(data)
{
if(isChat) messagesViewed(data.messages);
//Выводим сообщение
setTimeout(getMessages, 1000);
},
error : function (jq, a)
{
log("Ошибка при выборке сообщений: "+jq.responseText);
}
}
);
}

function messagesViewed(messages)
{
var viewedMessages = getKeys(messages);
$.ajax({
url : "messages.php",
type : "POST",
async : true,
dataType : "json",
data : {
action: 'viewed',
messages: viewedMessages
}
}
);
return viewedMessages;
}

function getKeys(obj)
{
var keys = [];
for(var key in obj)
keys.push(key);
return keys;
}

setTimeout(getMessages, 1000);
Быстрый ответ:

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