我有这样简单的数据网格:
<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(在这种情况下是原始的)。实际发生的事情是,一旦他们开始向上滚动它就会删除除第一个之外的所有内容,或者有时会错过向上滚动并将用户带到顶部而不会移除所有其他tbodys。
有什么想法吗?我认为问题在于if语句:
if( $('.uiGridContent').scrollTop() + $('.uiGridContent').innerHeight() >= $('.uiGridContent tbody').last().height() ) {
在向上滚动部分下。
答案 0 :(得分:2)
是的,你是对的,问题是if
声明中使用的条件:
if ( $('.uiGridContent').scrollTop() + $('.uiGridContent').innerHeight() >= $('.uiGridContent tbody').last().height() )
这是在询问.uiGridContent
加上它.innerHeight()
的scrollTop是否大于最后tbody
元素的高度。这类似于询问可滚动窗格的底部是否低于最后一个tbody
元素的高度(如果它位于.uiGridContent
的顶部)。那不是你想要的。
您想要询问可滚动窗格的底部是否位于最后一个tbody
元素的顶部之上。由于您只关心最后一个,您可以使用:
if ( $('.uiGridContent').scrollTop() + $('.uiGridContent').innerHeight() <= ($this[0].scrollHeight - $('.uiGridContent tbody').last().height()) )
虽然你真的希望像我在这个演示中一样缓存对$( ... )
的重复调用:
你可能想要缓存scrollBottom
(内容底部和可视区域底部之间的距离)的想法,无论你是否正在使用它,它可能有助于可读性: