jquery - 保持窗口不改变滚动位置,同时将项目添加到列表中?

Red*_*pia 31 jquery scroll window list prepend

我有一个页面显示消息,我希望它像Facebook一样工作,但没有懒惰的加载器.消息按时间顺序显示,最近一次显示.

我的消息列表最初填充了x个最新消息,窗口滚动到底部.当用户开始阅读该帖子时,他们会从下到上阅读.如果他们到达顶部,他们可以加载更多消息...我让他们点击一个按钮... facebook有一个懒惰的加载器.新消息将添加到列表中.

问题:由于新消息被添加,现有消息被推下,导致用户失去"查看"位置.在添加新消息时,如何保持用户当前的视图位置?例如,在Facebook中打开一个长消息线程,滚动到顶部导致添加新消息...即使滚动位置确实如此,您的视图位置也不会改变.

Jef*_*f B 51

在添加新消息之前存储对第一条消息的引用,在前置之后,将滚动设置为该消息的偏移量:

$(document).on('scroll', function() {
    var scroll = $(document).scrollTop();
    if (scroll < 1) {
        // Store eference to first message
        var firstMsg = $('.message:first');

        // Prepend new message here (I'm just cloning...)
        $('body').prepend(firstMsg.clone());

        // After adding new message(s), set scroll to position of
        // what was the first message
        $(document).scrollTop(firstMsg.offset().top);
    }
});
Run Code Online (Sandbox Code Playgroud)

演示:http: //jsfiddle.net/GRnQY/

编辑:我注意到你想要一个按钮.你可能需要做更多的数学运算:

$(document).on('click', '#loadMore', function() {
    var firstMsg = $('.message:first');

    // Where the page is currently:
    var curOffset = firstMsg.offset().top - $(document).scrollTop();

    // Prepend
    firstMsg.before(firstMsg.clone());

    // Offset to previous first message minus original offset/scroll
    $(document).scrollTop(firstMsg.offset().top-curOffset);
});
Run Code Online (Sandbox Code Playgroud)

演示:http: //jsfiddle.net/GRnQY/5/

  • 第二个解决方案非常棒 - 非常感谢,这对于实现"反向无限滚动"和Facebook消息非常有帮助. (6认同)

ood*_*vid 9

这里不需要jQuery,只需检查元素scrollHeight中的更改并相应地调整scrollTop,即:

var lastScrollHeight = el.scrollHeight;
for(var n=0; n<10; n++){
    // Prepend here...
}
var scrollDiff = el.scrollHeight - lastScrollHeight;
el.scrollTop += scrollDiff;
Run Code Online (Sandbox Code Playgroud)

演示

http://jsfiddle.net/fkqqv28e/

jQuery的

要从jQuery集合访问本机DOM节点,请使用数组访问; 即:

var lastScrollHeight = $('#myElement')[0].scrollHeight;
for(var n=0; n<10; n++){
    $('#myElement').prepend('<div>prepended '+Math.random()+'</div>');
}
var scrollDiff = $('#myElement')[0].scrollHeight - lastScrollHeight;
$('#myElement')[0].scrollTop += scrollDiff;
Run Code Online (Sandbox Code Playgroud)


eri*_*icP 5

一些来到这里的人可能只想添加内容而不需要当前的焦点跳跃。修改上面 Jeff B 的演示以使用 click 事件目标使这个习语更易于移植:

someButton.on('click', function() {
    var curOffset = $(this).offset().top - $(document).scrollTop();
    // add content to your heart's content.
    $(document).scrollTop($(this).offset().top-curOffset);
});
Run Code Online (Sandbox Code Playgroud)

参见http://jsfiddle.net/bwz8uLvt/1/(上面 Jeff B 演示的变体,但在页面中的任意点有 [add more] 按钮)。