5

我有像这样的简单数据网格:

<div class="uiGridContent">
    <table>
        <tbody id="page-1">
             <tr>
                <td>Cell 1</td>
                <td>Cell 2</td>
                <td>Cell 3</td>
             </tr>
        </tbody>
    </table>
</div>

* 请注意,我在 uiGridContent div 上方和下方的 div 中的单独表格中有页眉和页脚。对于本示例,这不是必需的。

var nextPage = 1, lastScrollTop = 0, st;

$('.uiGridContent').scroll(function(){

    var st = $(this).scrollTop();

    // We're scrolling down
    if (st > lastScrollTop){

        if( $('.uiGridContent').scrollTop() + $('.uiGridContent').innerHeight() >= $('.uiGridContent')[0].scrollHeight && nextPage < 10) {

            $.ajax({
                url: '<?php echo $appurl; ?>?page=' + nextPage,
                success: function(data) {
                    nextPage = nextPage + 1;
                    var content = $(data).find('.uiGrid tbody').html();

                    $('.uiGridContent tbody').last().after('<tbody id="page-'+nextPage+'">'+content+'</tbody>');

                },
                error: function(data) {

                    alert(data);

                }
            });

        }

        lastScrollTop = st;


    // We're scrolling up
    } else {

        if( $('.uiGridContent').scrollTop() + $('.uiGridContent').innerHeight() >= $('.uiGridContent tbody').last().height() ) {

            var pageToRemove = $('.uiGridContent tbody').last();

            if( pageToRemove.attr('id') != 'page-1') {
                pageToRemove.remove(); nextPage = nextPage - 1;

            } else {
                $('.uiGridContent').scrollTo(0,0);
            }

        }

        lastScrollTop = st;

    }

});

这个想法是当用户向下滚动表格时,当他们到达 gridcontent div 中最后一个 tbody 的底部时,它将在下一页加载。哪个工作正常!

问题在于向上滚动。计划是这样,当用户向上滚动到最后一个 tbody 时,它会再次将其删除,直到他们最终只剩下一个 tbody (在这种情况下是原始的)。实际发生的情况是,一旦他们开始向上滚动,它就会删除除第一个之外的所有内容,或者有时会错过向上滚动并将用户带到顶部而不删除所有其他 tbody。

有任何想法吗?我认为问题在于 if 语句:

if( $('.uiGridContent').scrollTop() + $('.uiGridContent').innerHeight() >= $('.uiGridContent tbody').last().height() ) {

在向上滚动部分下。

4

1 回答 1

2

是的,你是对的,问题是if语句中使用的条件:

if ( $('.uiGridContent').scrollTop() + $('.uiGridContent').innerHeight() >= $('.uiGridContent tbody').last().height() )

这是在询问.uiGridContent加号的 scrollTop.innerHeight()是否大于最后一个tbody元素的高度。这类似于询问可滚动窗格的底部是否低于最后一个tbody元素的高度(如果它位于.uiGridContent. 那不是你想要的。

您想要的是询问可滚动窗格的底部是否高于最后一个tbody元素的顶部。由于您只关心最后一个,您可以使用:

if ( $('.uiGridContent').scrollTop() + $('.uiGridContent').innerHeight() <= ($this[0].scrollHeight - $('.uiGridContent tbody').last().height()) )

虽然你真的想像$( ... )我在这个演示中那样缓存那些重复的调用:

http://jsfiddle.net/anmkU/3/

并且您可能希望在scrollBottom使用它时缓存 a(内容底部和可视区域底部之间的距离)的概念,这可能有助于提高可读性:

http://jsfiddle.net/anmkU/5/

于 2013-10-18T10:06:51.770 回答