【问题标题】:Prevent automatic "scrolling up" with jquery ajax $.load使用 jquery ajax $.load 防止自动“向上滚动”
【发布时间】:2014-04-16 16:08:51
【问题描述】:

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

【问题讨论】:

  • 尝试在您的 checkNewMessages 函数中添加 return false
  • 刚试过..不幸的是没用:(
  • 您可以使用sessionStorage or localStorage 保存该位置,并在重新加载后滚动到该位置。

标签: javascript php jquery css ajax


【解决方案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 并使用敲除渲染这个数组。但这将是一个更长的故事;)

希望对您有所帮助。

最好的问候, 克里斯

【讨论】:

  • 首先,我要感谢您抽出宝贵的时间。如果您不介意,您介意详细说明您的“更新”吗?我想保留 $.load 方法。另外,感谢其他建议,我计划这样做,但我从简单开始,并在此过程中建立更整洁的东西。再次感谢!
  • 我的意思是你只需在你的 .chatBox 周围添加一个容器 div,给它一个唯一的 ID 并更改 .chatBox 样式(只有 .chatBox 样式,而不是 .chatBox * 样式) #id 周围的容器。我目前不是@pc,所以无法更新jsfiddle,抱歉:)
  • 现在找到了一些时间并更新了您的 JSFiddle(无法测试,因为该服务在其他域中不可用)。这是新的小提琴:http://jsfiddle.net/m72jJ/2/
  • 非常感谢,这对克里斯很有帮助!
猜你喜欢
  • 1970-01-01
  • 2021-09-03
  • 2018-04-30
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
相关资源
最近更新 更多