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


Prevent automatic "scrolling up" with jquery ajax $.load

我正在尝试用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);

更新哦,好吧,刚刚看到你直接把负载指向聊天框本身,所以你完全替换了它。所以你肯定松开了卷轴的位置。

尝试在该.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渲染该数组。但这将是一个更长的故事;)

希望能有所帮助。

谨致问候,Chris