我为我的cms创建了一个功能,就像流行的无限滚动wordpress插件一样。当我滚动到页面底部并附加它们时,它会从db加载下一页。
首先它计算页面列表中存在的元素:
var $number = $(".pages-3 li").length;
Number作为参数传递给php,以便从数据库中获取下一页内容:
$.ajax({
type: "POST",
url:"ajax.php",
data: { number: $number},
beforeSend:function(){
$(".pages-3").append('<li>LOADING</li>');},
success:function(data) {
$(".pages-3 li:nth-last-of-type(1)").html(data);
}
但是有一个问题。我想添加预加载器,所以在ajax启动之前我已经将列表项添加到列表中。然后我会用实际的页面内容替换这个项目内容。
在附加预加载器列表项之前计算列表项。所以理论上脚本应该始终提供正确数量的列表位置。
然而,只有第一次数字是正确的。 然后数字大于2而不是大3.我真的不明白为什么。
答案 0 :(得分:0)
尝试在成功回调中使用:contains(),
success:function(){
$(".pages-3 li:contains(LOADING)").html(data);
}
或者您可以使用:last-child之类的
success:function(){
$(".pages-3 li:last-child").html(data);
}
答案 1 :(得分:0)
由于您添加的每个列表项的计数都是1,因此您添加的数据听起来像包含列表项。例如,如果变量data
已经包含在li
标记中,您将获得嵌套标记(<li><li>Content</li></li>
),因为jQuerys .html()
适用于内部元素的HTML。
要避免这种情况,请使用>
仅匹配直接后代,如下所示:
var $number = $(".pages-3 > li").length;
为避免将预加载器与实际内容混合(并使代码更清晰),您可以给它一个类来指示它是预加载器。出于显而易见的原因,我们称之为preloader
:
$(".pages-3").append('<li class="preloader">LOADING</li>');
然后,在计算元素时,排除类preloader
:
var $number = $(".pages-3 > li:not(.preloader)").length;
最后,在实际加载内容时删除该类:
$(".pages-3 > li.preloader").html(data).removeClass("preloader");