jQuery入門(六)jQuery實現瀑布分頁

来源:https://www.cnblogs.com/kongsq/p/18391664
-Advertisement-
Play Games

一、瀑布流分頁案例分析 1.1) 功能分析: 滑鼠下拉,載入分頁數據(10條) ,如下圖: 1.2) 如何確定當前顯示的數據已經瀏覽完畢? 公式:(滾動條距底部的距離 + 滾動條上下滾動的距離 + 當前視窗的高度) >= 當前文檔的高度 舉例: - 當前文檔高度:存儲10條數據,100px。 - 滾 ...


一、瀑布流分頁案例分析
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);
    }
}

 

成功實現。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在 C 語言中,記憶體分配主要分為以下幾個區域: 一、棧(Stack) 存儲內容: 局部變數:在函數內部聲明的變數,包括自動變數和函數參數。 函數調用信息:當函數被調用時,會在棧上分配空間來存儲函數的返回地址、參數和局部變數。 特點: 記憶體由編譯器自動管理,分配和釋放非常高效。 空間相對較小,一般幾兆 ...
  • 【HM】華為鴻蒙高級認證資料 目錄【HM】華為鴻蒙高級認證資料判斷題單選題多選題其它 判斷題 【判斷題】每調用一次router.pushUrl()方法,預設情況下,頁面棧數量會加1,頁面棧支持的最大頁面數量為32。正確(True) 【判斷題】首選項preferences是以Key-Value形式存儲 ...
  • 存儲區​ Android 一開始就將存儲區分為內部存儲和外部存儲,對應手機自帶的存儲和可插拔的 sd 卡(可類比於 PC 的硬碟和 U盤)。 內部存儲容量有限,Google 建議 App 數據儘量存儲於外部存儲中。 隨著硬體技術發展,自帶大容量空間的手機開始出現,關於內部存儲的描述逐漸偏離現實了,於 ...
  • App適配鴻蒙Next,開始做支付功能了,目前來說只有支付寶支持鴻蒙Next,微信還沒上架,但是支付寶官方的文檔跟Demo都很老,下載官方的Demo用最新版的DevEco-Studio導入都不成功。 後面在OpenHarmony三方庫中心倉找到了最新的代碼: https://ohpm.openhar ...
  • 當數組中存在空位時,遍曆數組需要選擇合適的方法,不同的方法可能返回不同的結果,有些方法會跳過空位,有些則會返回undefined。 ...
  • title: 使用 nuxi dev 啟動 Nuxt 應用程式的詳細指南 date: 2024/9/2 updated: 2024/9/2 author: cmdragon excerpt: 摘要:本文介紹了使用 nuxi dev 命令啟動 Nuxt 應用程式的方法,包括安裝 Nuxt.js、啟動開 ...
  • ECharts 是一款由百度開源的數據可視化工具,它提供了豐富的圖表類型,如折線圖、柱狀圖、餅圖、散點圖、雷達圖、地圖、K線圖、熱力圖、儀錶盤等,以及豐富的交互功能。ECharts 組件的核心功能實現原理主要包括以下幾個方面: 數據驅動: ECharts 採用數據驅動的設計理念,圖表的生成和更新都是 ...
  • @目錄markdown加粗斜體設置標題級別設置目錄刪除線無序列表有序列表分割線代辦引用高亮標記字體顏色代碼塊圖片鏈接表格公式表達行中公式獨行公式LaTex初步文章骨幹換行與換頁figure(基本是圖片)表格公式公式字體顏色左右居中figure引用文獻引用 markdown 加粗 **加粗樣式** 格 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...