scroll事件實現監控滾動條並分頁顯示示例(zepto.js)

来源:http://www.cnblogs.com/keang001/archive/2016/12/17/6192843.html
-Advertisement-
Play Games

scroll事件實現監控滾動條並分頁顯示示例(zepto.js ) 需求:在APP落地頁上的底部位置顯示此前其他用戶的購買記錄,要求此div盒子只顯示3條半,但一頁有10條,div內的滑動條滑到一頁底部自動載入下一頁併發載入埋點。 實現:首先理解三個概念,分別是contentH,viewH,scro ...


scroll事件實現監控滾動條並分頁顯示示例(zepto.js  )

 

需求:在APP落地頁上的底部位置顯示此前其他用戶的購買記錄,要求此div盒子只顯示3條半,但一頁有10條,div內的滑動條滑到一頁底部自動載入下一頁併發載入埋點。

 

實現:首先理解三個概念,分別是contentH,viewH,scrollTop。

contentH:即所要滑動的元素內容的高度,包括可見部分以及滾動條下麵的不可見部分。

ViewH:即我們看到的這個DIV的高度,不包括可見部分也不包括滾動條下麵的不可見部分。

scrollTop:即滾動條距離頂部的距離,若scrollTop的值為0,則代表滾動條在最上面。拉動滾動條,從最上面到最下麵,變化的是scrollTop的值。例:假如contentH的高度為2000,而這個DIV的高度只有300,那麼還有1700不可見,拉動滾動條到最底部,此時scrollTop為1700,所以這個1700也可以理解為滾動條可以滾動的長度。當滑動條拉到底部的時候,contentH=viewH+scrollTop。

故可實現如下:

$.ajax({
    type: "get",
    url: "record.json",//測試用假數據
    dataType: "json",
    success: function (records) {
        var showLength = records.data.length;//需要顯示的總長度
        var flag = showLength <= 10 ? showLength : 10;
        load_records(0, flag);//開始載入第一頁
        hxmClickStat('mar_all_207_ssjk.goumai.load.' + 1, {url_ver: "SJCGBS-10030"});//不論長度是否超過10都發送第一頁埋點
        if (showLength > 10) {
            var origin = 1, load = 2;
            $('.records_body').scroll(function () {
                var contentH = $(this).get(0).scrollHeight;
                var viewH = $('.records_body').height();
                var scrollTop = $(this).scrollTop();
                var pages = Math.ceil(showLength / 10);//需要顯示的總頁數
                if (viewH + scrollTop == contentH && load <= pages) {
                    if (load * 10 < showLength) {
                        load_records(origin++ * 10, load++ * 10);//載入下一頁的10條數據
                        hxmClickStat('mar_all_207_ssjk.goumai.load.' + origin, {url_ver: "SJCGBS-10030"});//滑動到底部開始載入下一頁時發送埋點
                    } else {
                        load_records(origin * 10, showLength);//載入最後一頁
                        hxmScrollBottomStat('mar_all_207_ssjk.goumai.bottom', {url_ver: "SJCGBS-10030"});//最後一頁發送埋點
                        load++;//避免重覆執行
                    }
                }
            });
        }
        function load_records(start, end) {
            for (var i = start; i < end; i++) {
                var stime = records.data[i].time;
                var accure_time = stime.slice(5, stime.length);
                var record_html = '<div class="records_item"><img src=' + records.data[i].avatar + ' class="avatar"/><div class="buyer_info"><p class="buyer_name">' + records.data[i].account + '</p><p class="status_title">購買成功</p></div>\n\<' +
                    'div class="buyer_address"><p class="buy_address">' + records.data[i].city + ' IP:' + records.data[i].ip + '</p>\n\<' +
                    'p class="buy_time">' + accure_time + '</p></div></div>';
                $(record_html).appendTo('.records_body');//插入一條購買記錄
            }
        }
    },
    error: function () {
        console.log('some errors happened!');
    }
});

   以上方法在蘋果手機瀏覽器中會達不到預期效果,解決方法及代碼改進

將觸底判斷條件更改為

if (viewH + scrollTop +1>= contentH && load <= pages)

 

  究其原因,故在滾動時將scrollTop和viewH、contentH分別列印出來,滑到底部的時候發現他們有1個單位的誤差,可能是因為某些div元素的高度不為整數而js在判斷的時候直接將其取整了,故可以選擇將其加1。

也可以使用另一種方式百分比的判斷條件來實現:在滾動條距離底端2%以內:scrollTop / (contentH– viewH) >= 0.98。

或者使用絕對數值範圍來實現,滾動條距離底端30px以內:contentH – viewH – scrollTop <= 30。

 


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

-Advertisement-
Play Games
更多相關文章
  • 編寫MyBatis配置文件(配置文件可以在上面下載的壓縮包root下找到PDF,裡面也有示例配置) Emp.xml 其中幾個常用的元素的作用如下:( 1.environment 和 2.mappers元素) 1.environment 元素:用於配置多個數據環境,這樣可以映射多個資料庫信息。採用de ...
  • java.lang.IncompatibleClassChangeError: Implementing class,用常見的解決問題的方法解決不常見的問題 ...
  • JavaScript的數組,相比其他語言,是比較特殊的。數組是Object類型,只不過,有幾個比較特殊的地方: 可以看到,如果不指定key值,數組會自動添加預設索引下標值,將其作為key。 這種情況下,length又是如何計算的呢? 從上面的代碼可以看出,length值是根據最大的索引下標計算的,也 ...
  • 看看變數類型,也是學習任何一門編程語言都必須要面對的重點知識 ...
  • 1.功能 解決javascript回調地獄 安裝eventProxy 2.常用方法 ①解決回調方法 emit:觸發事件 after all:告訴它你要監聽哪些事件,並給它一個回調函數。ep.all('event1', 'event2', function (result1, result2) {}) ...
  • Javascript中有'=='和' '兩種相等比較,後者是全等,會判斷數據類型,前者是相等,在比較時,會發生隱式轉換。 如果將兩個對象做'=='比較,結果會如何呢? 比如有如下兩個對象: 可以看到,哪怕兩個對象的屬性完全一樣,無論是'=='或者' ',返回都是false。 原因:對象通過指針指向的 ...
  • 1.map 2.remove 移除數組 array 中滿足 predicate 條件的所有元素 ,返回的是被移除元素數組. 3.uniq 唯一 ...
  • 1.find 2.findIndex _.findIndex(array, [predicate=_.identity], [thisArg])該方法類似 _.find,區別是該方法返回的是符合 predicate條件的第一個元素的索引,而不是返回元素本身. 參數 predicate 提供的是一個屬 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...