jQuery入门(六)jQuery实现瀑布流分页案例

news2024/9/21 22:44:28

        一、瀑布流分页案例分析

        1.1)  功能分析:

鼠标下拉,加载分页数据(10条) ,如下图:

案例分析:

        1.2)  如何确定当前显示的数据已经浏览完毕?

        公式:(滚动条距底部的距离 + 滚动条上下滚动的距离 + 当前窗口的高度) >= 当前文档的高度
        举例:
- 当前文档高度:存储10条数据,100px。
- 滚动条距底部的距离:1px。
- 当前窗口的高度:80px。
- 滚动条上下滚动的距离:>=19px。

        因为文档高度不确定,不能只判断 滚动条上下滚动的距离大于等于19px。即要判断: 滚动条距底部的距离1px+当前窗口的高度80px +滚动条上下滚动的距离19px >=当前文档的高度。


        1.3)  前置知识点:

         $(function(){})  页面加载事件
         $(window)       获取当前窗口对象
         scroll()            鼠标滚动事件
         $(window).height()       当前窗口的高度
         $(window).scrollTop()        滚动条上下滚动的距离
         $(document).height()        当前文档高度

二、实现思路和代码


  
 2.1)页面实现思路:

        1. 定义发送请求标记。(控制是否发起请求,如果当前处于请求状态,就不能再去发请求,只有在请求完毕才能重新发起请求,类似于多线程里的等待唤醒机制)
        2. 定义当前页码和每页显示的条数。 (分页必备的两个参数)
        3. 定义滚动条距底部的距离。(可以设置固定值1就可以)
        4. 设置页面加载事件。(事件里完成后续功能)
        5. 为当前窗口绑定滚动条滚动事件。()
        6. 获取必要信息(当前窗口的高度,滚动条上下滚动的距离,当前文档的高度)。
        7. 计算当前展示数据是否浏览完毕。(浏览完毕需要发起请求)
        8. 判断请求标记是否为 true。
        9. 为true,将请求标记置为 false,当前异步操作完成前,不能重新发起请求。 
        10. 根据当前页和每页显示的条数来请求查询分页数据。
        11. 当前页码+1。

页面和代码:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>网站首页</title>
    <link rel="stylesheet" href="css/tt.css">
</head>
<body>
<div class="top">
    <span class="top-left">下载APP</span>
    <span class="top-left"> 北京         晴天</span>
    <span class="top-right">更多产品</span>
</div>

<div class="container">

    <div class="left">
        <a>
            <img src="img/logo.png"><br/>
        </a>

        <ul>
            <li>
                <a class="channel-item active" href="#">
                    <span>
                        推荐
                    </span>
                </a>
            </li>

            <li><a class="channel-item" href="#">
                <span>
                    视频
                </span>
            </a></li>

            <li><a class="channel-item" href="#">
                <span>
                    热点
                </span>
            </a></li>

            <li><a class="channel-item" href="#">
                <span>
                    直播
                </span>
            </a></li>

            <li><a class="channel-item" href="#">
                <span>
                    图片
                </span>
            </a></li>

            <li><a class="channel-item" href="#">
                <span>
                    娱乐
                </span>
            </a></li>

            <li><a class="channel-item" href="#">
                <span>
                    游戏
                </span>
            </a></li>

            <li><a class="channel-item" href="#">
                <span>
                    体育
                </span>
            </a></li>

        </ul>

    </div>
    <div class="center">
        <ul class="news_list">
            <li>
                <div class="title-box">
                    <a href="#" class="link">
                        
                        
                        这里是内容 !这里是内容 !这里是内容 !这里是内容 !这里是内容 !1
                        <hr>
                    </a>
                </div>
            </li>
            <li>
                <div class="title-box">
                    <a href="#" class="link">
                        这里是内容 !这里是内容 !这里是内容 !这里是内容 !这里是内容 !2
                        <hr>
                    </a>
                </div>
            </li>
            <li>
                <div class="title-box">
                    <a href="#" class="link">
                        这里是内容 !这里是内容 !这里是内容 !这里是内容 !这里是内容 !3
                        <hr>
                    </a>
                </div>
            </li>
            <li>
                <div class="title-box">
                    <a href="#" class="link">
                        这里是内容 !这里是内容 !这里是内容 !这里是内容 !这里是内容 !4
                        <hr>
                    </a>
                </div>
            </li>
            <li>
                <div class="title-box">
                    <a href="#" class="link">
                        这里是内容 !这里是内容 !这里是内容 !这里是内容 !这里是内容 !5
                        <hr>
                    </a>
                </div>
            </li>
            <li>
                <div class="title-box">
                    <a href="#" class="link">
                        这里是内容 !这里是内容 !这里是内容 !这里是内容 !这里是内容 !6
                        <hr>
                    </a>
                </div>
            </li>
            <li>
                <div class="title-box">
                    <a href="#" class="link">
                        这里是内容 !这里是内容 !这里是内容 !这里是内容 !这里是内容 !7
                        <hr>
                    </a>
                </div>
            </li>
            <li>
                <div class="title-box">
                    <a href="#" class="link">
                        这里是内容 !这里是内容 !这里是内容 !这里是内容 !这里是内容 !8
                        <hr>
                    </a>
                </div>
            </li>
            <li>
                <div class="title-box">
                    <a href="#" class="link">
                        这里是内容 !这里是内容 !这里是内容 !这里是内容 !这里是内容 !9
                        <hr>
                    </a>
                </div>
            </li>
            <li>
                <div class="title-box">
                    <a href="#" class="link">
                        这里是内容 !这里是内容 !这里是内容 !这里是内容 !这里是内容 !10
                        <hr>
                    </a>
                </div>
            </li>
        </ul>

        <div class="loading" style="text-align: center; height: 80px">
            <img src="img/loading2.gif" height="100%">
        </div>

        <div class="content">
            <div class="pagination-holder clearfix">
                <div id="light-pagination" class="pagination"></div>
            </div>
        </div>

        <div id="no" style="text-align: center;color: red;font-size: 20px"></div>
    </div>
</div>
</body>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
    //1.定义发送请求标记
    let send = true;

    //2.定义当前页码和每页显示的条数
    let start = 1;
    let pageSize = 10;

    //3.定义滚动条距底部的距离
    let bottom = 1;//px

    //4.设置页面加载事件
    $(function () {
        //5.为当前窗口绑定滚动条滚动事件
        $(window).scroll(function () {
            //6.获取必要信息,用于计算当前展示数据是否浏览完毕
            //当前窗口的高度
            let windowHeight = $(window).height();

            //滚动条从上到下滚动距离
            let scrollTop = $(window).scrollTop();

            //当前文档的高度
            let docHeight = $(document).height();

            //7.计算当前展示数据是否浏览完毕
            //当 滚动条距底部的距离 + 当前滚动条滚动的距离 + 当前窗口的高度 >= 当前文档的高度
            if((bottom + scrollTop + windowHeight) >= docHeight) {
                //8.判断请求标记是否为true
                if(send == true) {
                    //9.将请求标记置为false,当前异步操作完成前,不能重新发起请求。
                    send = false;
                    //10.根据当前页和每页显示的条数来 请求查询分页数据
                    queryByPage(start,pageSize);
                    //11.当前页码+1
                    start++;
                }
            }
        });
    });

    //定义查询分页数据的函数
    function queryByPage(start,pageSize){
        //加载动图显示
        $(".loading").show();
        //发起AJAX请求
        $.ajax({
            //请求的资源路径
            url:"newsServlet",
            //请求的参数
            data:{"start":start,"pageSize":pageSize},
            //请求的方式
            type:"POST",
            //响应数据形式
            dataType:"json",
            //请求成功后的回调函数
            success:function (data) {
                if(data.length == 0) {
                    $(".loading").hide();
                    $("#no").html("加载完毕...");
                    return;
                }
                //加载动图隐藏
                $(".loading").hide();
                //将数据显示
                let titles = "";
                for(let i = 0; i < data.length; i++) {
                    titles += "<li>\n" +
                        "                <div class=\"title-box\">\n" +
                        "                    <a href=\"#\" class=\"link\">\n" +
                                                    data[i].title +
                        "                        <hr>\n" +
                        "                    </a>\n" +
                        "                </div>\n" +
                        "            </li>";
                }

                //显示到页面
                $(".news_list").append(titles);
                //将请求标记设置为true
                send = true;
            }
        });
    }

</script>
</html>

 2.2)服务器实现思路:

1. 获取请求参数(当前页,每页显示的条数)。
2. 根据当前页码和每页显示的条数,调用业务层的方法,得到分页 Page 对象。
3. 将得到的数据转为 json。
4. 将数据响应给客户端。

服务器代码:

public class NewsServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求和响应的编码
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");

        //1.获取请求参数
        String start = req.getParameter("start");
        String pageSize = req.getParameter("pageSize");

        //2.根据当前页码和每页显示的条数来调用业务层的查询方法,得到分页Page对象
        Page page = service.pageQuery(Integer.parseInt(start), Integer.parseInt(pageSize));

        //3.将得到的数据转为JSON
        String json = new ObjectMapper().writeValueAsString(page);

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //4.将数据响应给客户端
        resp.getWriter().write(json);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
}

成功实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2094561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python篇】Python 类和对象:详细讲解(下篇)

文章目录 Python 类和对象&#xff1a;详细讲解&#xff08;下篇&#xff09;15. 接口和协议&#xff08;Interfaces and Protocols&#xff09;15.1 什么是接口&#xff1f;15.2 协议的基本概念例子&#xff1a;定义飞行协议详细解释输出示例 16. 装饰器模式&#xff08;Decor…

A02、Java编程性能调优(02)

1、Stream如何提高遍历集合效率 1.1、什么是Stream 现在很多大数据量系统中都存在分表分库的情况。例如&#xff0c;电商系统中的订单表&#xff0c;常常使用用户 ID 的 Hash 值来实现分表分库&#xff0c;这样是为了减少单个表的数据量&#xff0c;优化用户查询订单的速度。 …

ZYNQ-Utlscale-RFSOC看门狗

ZYNQ-Utlscale-RFSOC看门狗复位 ZYNQ-Utlscale-RFSOC 看门狗的程序网上里程很少&#xff0c;开源资料也是几乎没有&#xff0c;最近需要用到这个功能&#xff0c;来来回回搞了一周才搞定。刚开始参考ZYNQ7000的资源&#xff0c;发现MPSOC不适用。很感谢下面的几篇文章&#xf…

探索TinyDB:轻量级数据库的优雅之旅

文章目录 探索TinyDB&#xff1a;轻量级数据库的优雅之旅背景&#xff1a;为何选择TinyDB&#xff1f;TinyDB是什么&#xff1f;如何安装TinyDB&#xff1f;简单库函数使用方法场景应用常见Bug及解决方案总结 探索TinyDB&#xff1a;轻量级数据库的优雅之旅 背景&#xff1a;为…

【电子通识】电子元器件可靠性基本概念

什么是电子元器件 电子元器件是电子产品的基本组成单元&#xff0c; 是电子元件和电子器件的总称。 通常电子元件指的是无源元件&#xff0c; 电子器件指的是有源器件。无源元件是对所供给的电能执行被动操作&#xff08;如耗散、储蓄或释放等&#xff09;的元件&#xff0c; 如…

《普通人学AI指南PDF》免费下载破10万。。。

你好&#xff0c;我是郭震 普通人如何开始AI&#xff0c;用好AI&#xff1f; 我在今年制作的《普通人学AI指南》PDF&#xff0c;从中或许能帮你找到答案&#xff1a; 1 PDF背景介绍 此PDF我是今年开始着手制作&#xff0c;到6月8日终版&#xff0c;中间历经反复多次修改&#x…

LabVIEW布尔值比较与信号状态上升沿下降沿检测

在 LabVIEW 编程中&#xff0c;布尔值的比较不仅是逻辑运算的重要组成部分&#xff0c;还广泛应用于信号的上升沿和下降沿检测。通过理解 True > False 这样的基本表达式&#xff0c;以及如何在程序中检测信号的状态变化&#xff0c;开发者可以有效地控制系统行为&#xff0…

内存管理篇-17解开页表的神秘面纱-上

--好像并没有解开。。 1.遗留的一些问题 &#xff08;1&#xff09;页表存储在内存的什么地方&#xff1f;页表服用的对象就是MMU&#xff0c;主要就为了MMU单元翻译的时候提供作用&#xff0c;因此能存放在MMU中的TLB缓存中&#xff0c;也可能存放在内存中。但是在内存中的什…

【MATLAB】matlab生成的图像如何导出(三种方法教会你)

我们经常使用matlab生成各类的图&#xff0c;如何将其导出&#xff0c;导出为何种类型。 方法一&#xff1a;选择 matlab 生成的图形界面 " Figure 1 " 的菜单栏 " 编辑 " — " 复制图窗 " , 就可以将图像拷贝到 Word 文档中 打开 Word 文档 ,…

远程调用以及注册中心Nacos

小编目前大一&#xff0c;刚开始着手学习微服务的相关知识&#xff0c;小编会把它们整理成知识点发布出来。我认为同为初学者&#xff0c;我把我对知识点的理解以这种代码加观点的方式分享出来不仅加深了我的理解&#xff0c;或许在某个时候对你也有所帮助&#xff0c;同时也欢…

YOLOv5课堂行为识别系统+GUI界面

课堂行为检测 gui/课堂行为识别系统/YOLOv5课堂行为识别/ yolov5/opencv/计算机视觉/python程序/深度学习/pytorch 数据集标注/配置好环境程序可直接运行/带UI界面/代码数据集/代码数据集 &#xff3b;功能&#xff3d;图片识别/视频识别/摄像头识别 损失/准确率等数据可在ten…

Golang 教程3——包

Golang 教程3——包 注意&#xff0c;该文档只适合有编程基础的同学&#xff0c;这里的go教程只给出有区别的知识点 文件结构 前置工作 在文件testproject01目录下执行 ‘go mod init gocode/testproject01’ (base) PS E:\Goproject\src\gocode\testproject01> go mo…

Linux学习——Ubuntu上QT添加资源

在我们平时的车载控制屏幕上一般不会只有文字和黑白的按钮&#xff0c;为了美观和容易操作&#xff0c;在设计的时候一般会添加图片或者是图标&#xff0c;来让界面的人机交互达到最好&#xff0c;那么我们今天就来学习一下如何在QT中添加资源图片&#xff01; 1.传输照片&…

easy_fastapi Python 后端开发框架

GitHub easy_fastapi by one-ccs 遵循 MIT 开源协议 Easy FastAPI 基于 FastAPI 开发的后端框架&#xff0c;集成了 SQLAlchemy、Pydantic、Alembic、PyJWT、PyYAML、Redis 等插件&#xff0c;旨在提供一个高效、易用的后端开发环境。该框架通过清晰的目录结构和模块化设计&am…

GNU/Linux - Linux kernel memory access

User space memory access from the Linux kernel An introduction to Linux memory and user space APIs By M. Jones 10 August 2010 Archive date: 2023-08-31 虽然字节可能是 Linux 中内存的最低可寻址单位&#xff0c;但页面才是内存的可管理抽象。本文首先讨论 Linux …

cuda,torch,paddle向下兼容

1、第一次配置yolov9模型时&#xff0c;使用的cuda的版本是11.6&#xff0c;torch和torchvision都是对应版本的 使用的tensorrt版本8.6&#xff0c;可以正常跑yolov9 其它不动&#xff0c;直接将cuda版本换为cuda11.7&#xff0c;依然可以正常运行 2、paddleseg paddle同样安…

3.1 线性结构

令序列X、Y、Z的每个元素按顺序进栈&#xff0c;且每个元素进栈.出栈各一次&#xff0c;则不可能得到出栈序列&#xff08; &#xff09;。 A. XYZ B. XZY C. ZXY D. YZX 正确答案是 C。 解析 ZXY不可能得到这个序列&#xff0c;因为当Z最先出栈&#xff0c;说明X、Y已经入栈&a…

【FRP 内网穿透】

文章目录 一、什么叫内网穿透1、内网穿透技术的描述2、内网穿透技术的工作方式通常包括以下几个步骤 二、用内网穿透解决了什么问题三、常见的内网穿透解决方式1、FRP &#xff08;开源&#xff09;2、花生壳&#xff08;商业&#xff09;3、ZeroTier&#xff08;开源 商业&…

【js逆向专题】4.python调用JS和扣代码

小节目标: 掌握 python调用js代码方式熟悉 js开放接口进行调用了解 补环境的基本概念掌握 js调试技巧 一. pyexecjs的使用 1. 简介 PyExecJS 是一个 Python 库&#xff0c;用于在 Python 环境中执行 JavaScript 代码。它实际上是对 ExecJS 库的 Python 封装&#xff0c;Exec…

Spring数据类型转化

HTTP请求中携带的queryString和form-data数据&#xff08;文件除外&#xff09;都是是String类型。那么在Controller上怎么可以直接指定数据类型呢。其实是Spring默认帮我们做了类型转化。 内置数据类型转换器介绍 Converter<S, T> String -> Integer GetMapping(&…