Как отправить последний класс 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 = ...,

Другие вопросы по тегам