Как отправить последний класс div в опросе ajax?
У меня проблемы с моей системой чата ajaxPoll. Я пытаюсь отправить последний идентификатор сообщения чата. div
вернуться к php
, тогда запрос может показывать только результаты, которые выше, чем последний отправленный идентификатор.
Все сообщения чата находятся в div
называется chat_log
, Сообщение будет иметь div
вокруг него с классом идентификатора сообщения. Было бы текст message
затем идентификатор этого сообщения, например: class="message543"
, Итак, чтобы было легче понять, вот пример HTML-кода со структурой и в правильном порядке.
<div id='chat_log'>
<div class='message435'></div>
<div class='message436'></div>
<div class='message437'></div>
<div class='message438'></div>
<div class='message439'></div>
<div class='message440'></div>
<div class='message441'></div>
</div>
Как видите, в div max 7 сообщений. Любые сообщения выше этого значения удаляются (все, если это работает нормально, просто немного дополнительной информации.) Еще одна вещь, которую я хочу отметить, я использую библиотеку jquery и плагин jquery, найденный здесь, кредит этой публикации в блоге. (Информацию о том, что делает плагин, можно найти там.)
Что я пробовал:
function ajaxGo() {
$.ajaxPollSettings.pollingType = "interval";
$.ajaxPollSettings.interval = 700;
$.ajaxPollSettings.maxInterval = 1000;
$.ajaxPollSettings.durationUntilMaxInterval = 2000;
var httpcount = 1;
var lastDiv = lastDiv = $('#chat_log').find('div:last-child');
var lastId = lastDiv[0].className.substring(7);
$.ajaxPoll({
url: "place_chat/update.php",
type: "POST",
data: {
where: where,
'last': lastId
},
dataType: "html",
cache: false,
successCondition: function (result) {
var responseString = result;
if (result != '') {
$(result).appendTo('#chat_log').show();
lastDiv = lastDiv = $('#chat_log').find('div:last-child');
lastId = lastDiv[0].className.substring(7);
console.log(lastId);
httpcount = httpcount + 1;
if (!hasFocus && !titleCurrentlyChanging) {
changeTitle();
}
soundHandle = document.getElementById('soundHandle');
soundHandle.src = '../Sounds/Message.wav';
soundHandle.play();
}
}
});
}
$(document).ready(function () {
$('#chat_log').append('<div class="message0">Test</div>');
setTimeout(ajaxGo, 500);
});
Код снимает строку "сообщение", а затем захватывает номер. Код:
lastDiv = lastDiv = $('#chat_log').find('div:last-child');
lastId = lastDiv[0].className.substring(7);
console.log(lastId);
... работает правильно при вставке в консоль и выводит правильный, последний div
сообщение id
,
Однако, когда он запускается не вручную (вероятно, потому, что он не находится ни в функции, ни в цикле, ни в чем-то другом), код, по какой-то причине, только отправляет ' 0
', когда есть другие сообщения с id
из 1000
+. Я также пробовал много других вещей, таких как setInterval
и т. д. Одна вещь, я думаю, может быть причиной проблемы является область действия переменной, как если бы успех function
опроса вызывается, он не будет корректировать lastId
переменная. Я не совсем уверен, если это так. Если это так, я был бы признателен за поддержку того, как исправить область видимости переменной для правильной работы кода.
Кстати, php работает успешно, поэтому мне не нужна помощь с этим.
Важное изменение (сделать проблему проще для понимания): код
lastDiv = lastDiv = $('#chat_log').find('div:last-child');
lastId = lastDiv[0].className.substring(7);
... отлично работает, это его окружение (структура), вот в чем проблема. Также where
не имеет отношения к этому where
просто говорит php, откуда был отправлен скрипт. Я знаю, что есть div, добавленный в первый называется test
вот и определим первое lastId
как 0
, Цикл должен обрабатывать получение последних lastId
, но это не так.
Что я обнаружил: lastId
не редактируется в ajaxPoll, он получает правильный last Id от div, но не редактирует lastId
, Что делает ПОЧТИ однозначно, что это проблема сферы
2 ответа
Одна проблема ajaxPoll
, Вы создаете данные для отправки один раз, и они не переоцениваются при каждом опросе.
Другая проблема заключается в том, что lastId
является локальным для ajaxGo
функция. Переместите это снаружи.
Вот jsfiddle, который использует jQuery.ajax
а также setInterval
:
var lastId = 0;
function ajaxGo() {
$.ajax({
url: "/echo/html/",
type: "POST",
data: {
'last': lastId,
html: '<div class="message' + (parseInt(lastId) + 1) + '">' + (parseInt(lastId) + 1) + '</div>'
},
dataType: "html",
success: function(result) {
if (result) {
$(result).appendTo('#chat_log').show();
lastDiv = $('#chat_log').find('div:last-child');
lastId = lastDiv[0].className.substring(7);
console.log(lastId);
/* if (!hasFocus && !titleCurrentlyChanging) {
changeTitle();
}
soundHandle = document.getElementById('soundHandle');
soundHandle.src = '../Sounds/Message.wav';
soundHandle.play();*/
}
}
});
}
var timer = setInterval(ajaxGo, 1000);
Некоторый код, который не относится к вашему вопросу, был закомментирован или опущен.
Если это проблема объема, это, вероятно, будет исправлено путем
var lastId = -1;
в верхней части вашего кода, а затем заменить var lastId = ...
с lastId = ...
,