Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 延迟加载博客文章_Jquery_Lazy Loading - Fatal编程技术网

Jquery 延迟加载博客文章

Jquery 延迟加载博客文章,jquery,lazy-loading,Jquery,Lazy Loading,我有一个博客帖子列表,数量已经达到25+了,但都在一个页面中,所以我需要尝试构建一个延迟加载程序 我尝试过各种插件,但没有一个是有效的 是否有方法检查div的顶部值,如果它在视图中,则添加一个类,使div可见(页面加载div被隐藏) 我看过这些帖子,但在尝试了各种解决方案后,没有一个对我有效 如果有人能说明这一点,我将不胜感激。 我不知道我错在哪里 非常感谢是一个延迟加载插件的列表,但更多用于图像加载 你可以尝试的是隐藏除前三个之外的每个blogpost元素,然后on是一个很好的插件,

我有一个博客帖子列表,数量已经达到25+了,但都在一个页面中,所以我需要尝试构建一个延迟加载程序

我尝试过各种插件,但没有一个是有效的

是否有方法检查div的顶部值,如果它在视图中,则添加一个类,使div可见(页面加载div被隐藏)

我看过这些帖子,但在尝试了各种解决方案后,没有一个对我有效

如果有人能说明这一点,我将不胜感激。 我不知道我错在哪里

非常感谢

是一个延迟加载插件的列表,但更多用于图像加载


你可以尝试的是隐藏除前三个之外的每个blogpost元素,然后on

是一个很好的插件,可以对进入视图的元素做出反应;他们甚至有。

我不知道您的设置如何,但我建议使用jquery找出距页面顶部的距离这将是:

var scrollTop     = $(window).scrollTop(),
    elementOffset = $('#my-element').offset().top,
    distance      = (elementOffset - scrollTop);
根据此堆栈溢出帖子:

把这些应用到你的第25篇文章中,在每一篇文章上都加上编号的id或名字(我想这个页面是PHP生成的)

然后,当距离达到一定程度时,使用ajax加载更多的博客文章

编辑:可以使用大于的jquery隐藏它们:

$(".element-class:gt(24)").css("display","none");​
此处的文档:

然后,只要您滚动过某个滚动顶部,就可以设置

$("visible-element").css("display","block")
编辑2:
试试这个小提琴-

我已经尝试过获取元素的顶部并显示内容,当它在视口中时,可以通过ajax调用隐藏或加载内容。试试这个代码。您可以使用敏感度变量进行试验,看看什么最适合您:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
    <script type="text/javascript">
        var processScroll = true;
        var sensitivity = 10;
        function handleScroll()
        {
            if (processScroll) {
                processScroll = false;
                topHidden = $('.block_hidden:first').offset().top;
                if(($(window).scrollTop() + $(window).height() ) > (topHidden + sensitivity))
                {
                    console.log('show now');
                    $('.block_hidden:first').removeClass('block_hidden').addClass('block');
                }
            }

            processScroll = true;
        }

        $(document).ready(function()
        {
            $(window).scroll(handleScroll);
        });
    </script>

    <style>
        .block_hidden{
            width:300px;
            background: green;
            margin:5px;
            visibility: hidden;
            height: 10px !important;
        }

        .block{
            height: 200px;
            width:300px;
            background: green;
            margin:5px;
        }
    </style>

</head>
<body>
    <div class="block"></div>
    <div class="block"></div>
    <div class="block"></div>
    <div class="block_hidden"></div>
    <div class="block_hidden"></div>
    <div class="block_hidden"></div>
    <div class="block_hidden"></div>
    <div class="block_hidden"></div>
    <div class="block_hidden"></div>
</body>
</html>

var processScroll=true;
var敏感性=10;
函数handleScroll()
{
如果(进程滚动){
processScroll=false;
topHidden=$('.block_hidden:first').offset().top;
如果($(窗口).scrollTop()+$(窗口).height())>(topHidden+灵敏度))
{
log('show now');
$('.block\u hidden:first').removeClass('block\u hidden').addClass('block');
}
}
processScroll=true;
}
$(文档).ready(函数()
{
$(窗口)。滚动(把手滚动);
});
.block_隐藏{
宽度:300px;
背景:绿色;
保证金:5px;
可见性:隐藏;
高度:10px!重要;
}
.街区{
高度:200px;
宽度:300px;
背景:绿色;
保证金:5px;
}

您询问的是延迟加载

答案必须包括服务器端。您的问题没有指定您使用的服务器端语言的类型。在我的回答中,我将使用一些基本的PHP代码来模拟随机的博客文章

延迟加载意味着我们只加载用户可以看到的内容,然后在需要时加载更多数据

加载数据意味着从服务器请求数据。这通常包括但不一定包括。(尽管您可能可以使用AJAX)。JQuery有一个奇妙的特性

最大的问题是-什么应该触发我的下一次加载-因此所有的插件

我接受了Tgr的建议,并用航路点实现了一个延迟加载。我甚至按照Tgr的建议使用(请给Tgr更多的分数)

您可以在上看到我的实现

我所做的是更改标题的模拟博客文章。每次用户向下滚动足够多,我就会从服务器上收到更多的帖子

我为我的源代码添加了一个下载链接,以便您可以下载并开始使用它。只要运行
main.html
就可以了

文件
more_posts.php
生成一个带有随机标题的
lorem ipsum
post。(我需要一些假内容才能在页面上有一个滚动条)

看起来像这样

<h1> This is post number <?php echo uniqid("",true)?> </h1>

<div style="color:red">
Lorem ipsum dolor .... Quisque ut pretium nibh.
</div>

<div style="color:blue">
Lorem ipsum dolor .... Quisque ut pretium nibh.
</div>
这个想法是你有一个
部分
,它包含了前几篇文章,并且可以让你在页面上滚动。在底部,在
页脚
中有一个
更多
链接,当禁用JavaScript时,该链接应作为常规的“下一个”链接

航路点使用此链接触发下一次装载。每当链接即将显示在屏幕上时,我们都将使用ajax自动获取下一篇文章

所以JavaScript部分看起来是这样的:

$(document).ready(function() {

    function loadMorePosts( callback ){
        $.get($('.more a').attr('href'), function(data) { 
                $('#container').append($(data)); 
                if ( typeof(callback) == "function" ){ callback(); }
        })
    }
    loadMorePosts();

    var $footer = $('footer');
    var opts = {
        offset: '100%'
    };

    $footer.waypoint(function(event, direction) {
                        $footer.waypoint('remove');
                        loadMorePosts( function(){ $footer.waypoint(opts);} );


            }, opts);
});
函数
loadMorePosts
调用方法
$.get
,这是
$.ajax({type:'get'..})
的更简单语法。它使用与链接的href属性相同的URL。在我的示例中,href属性指向“more_posts.php”

当我的演示加载时,内容完全是空的,所以我继续获取我想要显示的第一篇文章。然后我告诉waypoint听页脚的声音——每当页脚靠近时,我就会去获取更多的帖子

有一个棘手的部分,我执行
$footer.waypoint('remove')
并将
回调传递给
loadMorePosts
,该回调再次将waypoint绑定到footer。这只是一个技术性问题-航路点需要您在获取更多HTML时删除触发器,否则您的页面可能会表现得很滑稽

这或多或少是

我试着让这个问题尽可能简单,但这是一个巨大的问题,在一个答案中涵盖。
所以,如果我能做得更多,请告诉我

抱歉,我需要能够根据div的y位置延迟加载div,至少我认为这是解决方案。你知道延迟加载是否可以加载不仅仅是图像吗?对不起,我不是故意要让人痛苦,但这是一个延迟加载吗?我不想要一个无限长的卷轴,当div在视图中时,它会自动消失。感谢您的快速响应。延迟加载意味着您在用户到达之前不会加载内容;你似乎有某种“懒惰的表现”的想法。身份证
$(document).ready(function() {

    function loadMorePosts( callback ){
        $.get($('.more a').attr('href'), function(data) { 
                $('#container').append($(data)); 
                if ( typeof(callback) == "function" ){ callback(); }
        })
    }
    loadMorePosts();

    var $footer = $('footer');
    var opts = {
        offset: '100%'
    };

    $footer.waypoint(function(event, direction) {
                        $footer.waypoint('remove');
                        loadMorePosts( function(){ $footer.waypoint(opts);} );


            }, opts);
});