0

我的 ajaxPoll 聊天系统有问题。我正在尝试将聊天消息的最后一个 ID 发送divphp,因此查询只能显示高于发送的最后一个 id 的结果。

所有聊天消息都在一个div被调用的chat_log. div一条消息周围会有一个带有消息id 的类。它将具有文本message,然后是该消息的 ID,例如: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);
}); 

代码去掉字符串'message',然后获取数字。编码:

lastDiv = lastDiv = $('#chat_log').find('div:last-child');
lastId = lastDiv[0].className.substring(7);
console.log(lastId);

...粘贴到控制台时可以正常工作并输出正确的 last div's message id

但是,当非手动运行时(可能是因为它不在函数或循环中或其他什么情况下)它不会,由于某种原因,代码仅0在有其他带有+id的消息时发送“” 1000。我还尝试了很多其他的东西,比如setInterval's,等等。我认为可能导致问题的一件事是变量范围,就好像当function调用成功的民意调查时,它不会调整lastId变量。我不完全确定是否是这种情况。如果是这种情况,我将不胜感激有关如何修复变量范围以使代码正常工作的支持。

附带说明一下,php 运行成功,所以我不需要帮助。

重要编辑(使问题更容易理解):代码

lastDiv = lastDiv = $('#chat_log').find('div:last-child');
lastId = lastDiv[0].className.substring(7);

...工作正常,它的周边区域(结构)似乎是问题所在。也where与此无关,where只是告诉 php 脚本是从哪里发送的。我知道在 first called 上附加了一个 div test,即将第一个定义lastId0. Loop应该处理获取最新的,lastId但它没有。

我发现lastId没有在 ajaxPoll 中编辑,它从 div 获取正确的 lastId,但没有编辑lastId。这几乎可以确定这是一个范围问题

4

2 回答 2

2

一个问题是ajaxPoll。您创建要发送一次的数据,并且不会在每次轮询时重新评估。

另一个问题是函数lastId的本地问题ajaxGo。把它移到外面。

这是一个使用and的jsfiddlejQuery.ajaxsetInterval

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);​

一些与您的问题无关的代码已被注释掉或省略。

于 2012-09-19T21:00:10.033 回答
0

如果是范围问题,可能会通过放置

var lastId = -1;

在代码的顶部,然后替换var lastId = ...lastId = ....

于 2012-09-19T21:01:18.143 回答