Как отправить последний класс 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, он получает правильный lastId из div, но не редактирует lastId. Что делает ПОЧТИ определенным, что это проблема масштаба


person Jordan Richards    schedule 19.09.2012    source источник
comment
Что это where: where? Вы сделали какую-то ошибку там.   -  person Levi Morrison    schedule 20.09.2012
comment
В DOMReady вы добавляете div с классом message0, теперь ваш последний div возвращает 0.   -  person undefined    schedule 20.09.2012
comment
Используйте разделитель, чтобы получить значение, это проще: message_0, затем используйте split(_)   -  person Diodeus - James MacFarlane    schedule 20.09.2012
comment
Проблема не имеет ничего общего с lastDiv = lastDiv = $('#chat_log').find('div:last-child'); lastId = lastDiv[0].className.substring(7);. undefined вы не читали, когда есть другие сообщения с идентификатором 1000+. ?   -  person Jordan Richards    schedule 20.09.2012
comment
@LeviMorrison, который не имеет отношения к этой ситуации, просто сообщает php, откуда он был отправлен.   -  person Jordan Richards    schedule 20.09.2012
comment
почему не $('#chat_log > div:last-child').prop('class') ?   -  person JKirchartz    schedule 20.09.2012


Ответы (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);​

Некоторый код, не относящийся к вашему вопросу, был закомментирован или опущен.

person Levi Morrison    schedule 19.09.2012
comment
Отличный ответ, именно то, что я искал :) Спасибо! - person Jordan Richards; 20.09.2012

Если это проблема области действия, она, вероятно, будет исправлена ​​путем добавления

var lastId = -1;

в верхней части кода, а затем замените var lastId = ... на lastId = ....

person uınbɐɥs    schedule 19.09.2012