使用jquery ajax $ .load防止自动“向上滚动”

时间:2014-04-16 16:08:52

标签: javascript php jquery css ajax

我正在尝试使用jquery和php构建一个ajax聊天。除滚动外,一切正常。 基本上,当聊天的内部内容会自动重新加载时,我设置了一个超时,但如果我滚动,这会使聊天框一直向上滚动。 这是没有很多li(消息)的代码(它们加载了php):

http://jsfiddle.net/m72jJ/1/

这是一个你可以亲眼看到的实时版本(在jsfiddle中不会出现向上滚动):

http://alfie.co.nf/templates/sandbox/php/Ajax-chat/

这是Jquery:

var form = $('form');

form.submit(function(event){
    event.preventDefault();
    var username = form.find('input[name=user]').val(),
        messform = form.find('input[name=message]')
        mess     = messform.val(),
        url      = form.attr('action');

    var posting = $.post(url, {message : mess , user : username});
    posting.done(function(data){
        var content = $(data).find('.chatBox');
        $('.chatBox').empty().append(content).fadeIn();
        messform.val("").fadeIn();
    });
})

function checkNewMessages(){
    $('.chatBox').load(" .chatBox");
}

setInterval(checkNewMessages, 500);

1 个答案:

答案 0 :(得分:1)

<强>更新 哦,好吧,只是看到你直接将负载指向聊天箱本身,所以你完全替换它。所以你肯定会松开滚动位置。

尝试在.chatBox周围添加一个容器,并将.chatBox的样式更改为该容器(并且不要将其命名为.chatBox)。

这是我的意思的一个例子(与你的第一个版本的jsfiddle相比):

http://jsfiddle.net/m72jJ/2/

希望有所帮助。

原帖 似乎问题在于jQuery加载方法。

我创建了一个小例子,其中重置了整个内容,但没有使用ajax和$ .load:

http://jsfiddle.net/aYbsQ/

HTML:

<div id="OuterContainer">
    <div id="ContentContainer">
    </div>
</div>

JavaScript的:

jQuery(document).ready(function() {
    var lineCount = 0;
    var outerContainer = $('#OuterContainer'); 
    var contentContainer = $('#ContentContainer');

    var updateContent = function () {
        contentContainer.empty();
        for (var index = 0; index < 50; index++){
            lineCount++;
            contentContainer.html(contentContainer.html() + '<p>' + lineCount + ': One chat content line</p>');   
        }
    }

    window.reloadInterval = setInterval(function() { updateContent(); }, 1000);
});

也许您应该在PHP脚本中创建一个只显示消息的ajax端点,这样您就可以使用标准的$ .ajax调用并使用$(element).html()来生成HTML。

无论如何,在我看来,我会将消息加载从纯HTML更改为JSON,并在客户端缓存聊天消息,并仅从服务器发送新消息。这将减少传输的数据量。这可以通过使用像KnockoutJs这样的框架轻松实现,在框架中填充observableArray并使用knockout渲染此数组。但这将是一个更长的故事;)

希望有所帮助。

祝你好运, 克里斯

相关问题