js防抖和節流優化瀏覽器滾動條滾動到最下麵時載入更多數據

来源:https://www.cnblogs.com/czkolve/archive/2019/05/14/10859176.html
-Advertisement-
Play Games

防抖和節流,主要是用來防止過於平凡的執行某個操作,如瀏覽器視窗變化執行某個操作,監聽某個input輸入框keyup變化,瀑布流佈局時Y軸滾動,圖片載入。 js函數的防抖 經過一段事件才執行某個操作,如果時間內又執行了該操作則延長時間重新開始計算 /* 輸入快的話會出現輸出結果多次重覆 */ 使用防抖 ...


  防抖和節流,主要是用來防止過於平凡的執行某個操作,如瀏覽器視窗變化執行某個操作,監聽某個input輸入框keyup變化,瀑布流佈局時Y軸滾動,圖片載入。

    js函數的防抖

      經過一段事件才執行某個操作,如果時間內又執行了該操作則延長時間重新開始計算

/* 不做處理input觸發keyup事件 */
/* 輸入快的話會出現輸出結果多次重覆 */
window.onload = function () {
    let obj = document.getElementById('input')
    obj.addEventListener('keyup',()=>{
        let val = obj.value;
        inputchange(val)
    },false)
}
function inputchange(val) {
    console.log(val)
}
// 11 11 123 123 123456 123456 123456

  使用防抖去處理

/* 使用防抖去處理input觸發keyup事件 */
/* 輸入快的話會也不會輸出多次重覆結果 */
window.onload = function () {
    let obj = document.getElementById('input')
    let callback = inputchange()
    obj.addEventListener('keyup',()=>{
        let val = obj.value;
        callback(val)
    },false)
}
// 高級函數的應用
// 閉包time為局部變數 但不會在inputchange 函數調用完後釋放
// 函數返回函數
function inputchange() {
    var time
    return function(val){
        if(time)
        {
            clearTimeout(time)
        }
        time = setTimeout(() => {
            console.log(val)
        }, 200);
    }
}

    js函數節流

      定義:執行某個操作後一段時間內不在不行該操作

/* 使用節流去處理input觸發keyup事件 */
/* 輸入快的話會也不會輸出多次重覆結果 */
window.onload = function () {
    let obj = document.getElementById('input')
    let callback = inputchange()
    obj.addEventListener('keyup',()=>{
        let val = obj.value;
        callback(val)
    },false)
}
// 使用閉包保存hasdone
function inputchange() {
    var hasdone = false
    return function(val){
        // 如果已經執行 hasdone = true 則直接返回
        if(hasdone)
        {
            return;
        }
        // 設置已經執行
        console.log(val)
        hasdone =true
        /* 一段時間後設置hasdone 為能夠再次執行 */
        time = setTimeout(() => {
            hasdone = false
        }, 2000);
    }
}

  上面的節流,第一次輸入馬上執行,是最後輸入不執行。

  還有就是第一次輸入不馬上執行,時間內最後執行

/* 使用節流去處理input觸發keyup事件 */
/* 輸入快的話會也不會輸出多次重覆結果 */
window.onload = function () {
    let obj = document.getElementById('input')
    let callback = inputchange()
    obj.addEventListener('keyup',()=>{
        let val = obj.value;
        callback(val)
    },false)
}
// 使用閉包保存hasdone
/* 時間內不馬上執行,時間段內只執行一次 */
function inputchange() {
    var hasdone = false
    var time = null
    return function(val){
        // 如果已經執行 hasdone = true 則直接返回
        if(hasdone)
        {
            return;
        }  
        // 設置已經執行      
        hasdone =true
        /* 一段時間後設置hasdone 為能夠再次執行 */
        time = setTimeout(() => {
            
            console.log(val)
            hasdone = false
        }, 500);
    }
}

 js 實現瀏覽器滾動條滾動到最下麵時,載入更多數據

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="./js/fangdouhejl.js"></script>
    <style>
        .box{
            height:890px;        
        }
        li{
           height: 60px;     
        }
        .loading{
            width: 80px;
            height: 40px;
            margin: 0 auto;
            margin-top:100px;
            display: none;
        }
        .loading span{
            display: inline-block;
            width: 8px;
            height: 100%;
            border-radius: 4px;
            background: lightgreen;
            -webkit-animation: load 1s ease infinite;
        }
        @-webkit-keyframes load{
            0%,100%{
                height: 40px;
                background: lightgreen;
            }
            50%{
                height: 70px;
                margin: -15px 0;
                background: lightblue;
            }
        }
        .loading span:nth-child(2){
            -webkit-animation-delay:0.2s;
        }
        .loading span:nth-child(3){
            -webkit-animation-delay:0.4s;
        }
        .loading span:nth-child(4){
            -webkit-animation-delay:0.6s;
        }
        .loading span:nth-child(5){
            -webkit-animation-delay:0.8s;
        }
    </style>
</head>
<body>
    <ul id="box">
        <li>baojia1</li>
        <li>baojia2</li>
        <li>baojia3</li>
        <li>baojia4</li>
        <li>baojia5</li>
        <li>baojia6</li>
        <li>baojia7</li>
        <li>baojia8</li>
        <li>baojia9</li>
        <li>baojia10</li>
        <li>baojia11</li>
        <li>baojia12</li>
        <li>baojia13</li>
        <li>baojia14</li>
        <li>baojia15</li>
        <li>baojia16</li>
        <li>baojia17</li>
        <li>baojia18</li>
        <li>baojia19</li>
        <li>baojia20</li>
    </ul>
    <div class="loading" id="loading">
        <span></span>
        <span></span>
        <span></span>
        <span></span>
        <span></span>
    </div>
</body>
</html>
/* 瀏覽器滾動事件onsroll */
/* 實現瀏覽器滾動到最下麵實現載入 */
var loadmore = loadmoreresource ();
/* 模仿滾到最下麵繼續載入數據 */
window.onscroll = function (e) {
    /* 判斷是否滾到最下麵 */
    /* 如果已經滾到最下麵則執行某個操作 */
    var e =e || window.event;
    // 為了相容谷歌和火狐 document.body.scrollTop是谷歌上的
    /* 滾動條的垂直位置 */
    var scrolltop = document.documentElement.scrollTop||document.body.scrollTop;
    /* 整個頁面的正文高度 */
    var scrollHeight = document.documentElement.scrollHeight||document.body.scrollHeight;
    /* 可見區域高度 */
    var clientHeight = document.documentElement.clientHeight||document.body.clientHeight;

    /* 當scrolltop加clientHeight 等於scrollHeight */
    if(scrollHeight === (scrolltop+clientHeight))
    {
        loadmore();
    }
}

/* 往下拉時載入的數據 */
/* 使用函數節流優化載入,否則會出現一次性載入很多次 */
function loadmoreresource () {
    let  i = 21; 
    /* 定義是否已經載入 */
    let isloading = false;
    return function () {
        /* 假如已經在載入中了則直接返回 */
        if(isloading) {
            return;
        }
        /* 出現載入動畫 */
        loadingimg()
        let obj = document.getElementById('box');
        /* 代碼片段 用於插入多個標簽 */
        let docfragment = document.createDocumentFragment();
        for(let j=0;j<5;j++){
            let li = document.createElement('li')
            li.append('baojia'+i)
            docfragment.appendChild(li)
            i++;
        }
        /* 設置當前載入的狀態為true */
        isloading = true;
        /* 使用setTimeout 模擬從api載入數據 */
        setTimeout(() => {
            obj.appendChild(docfragment)
            loadingimg()
            /* 將載入狀態設置為false */
            isloading = false
        }, 3000);
    }
}
/* 載入動畫 */

function loadingimg() {
    let loading = document.getElementById('loading');
    if(loading.style.display==='block') {
        loading.style.display = 'none';
    } else {
        loading.style.display = 'block';
    }
}

 


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

-Advertisement-
Play Games
更多相關文章
  • innodb_flush_log_at_trx_commit 該參數控制重做日誌寫入磁碟的過程。我們知道 InnoDB 使用“Write Ahead Log”策略來避免數據丟失問題,即依靠重做日誌來保證數據能在丟失後進行恢復。因此,InnoDB 重做日誌的持久化非常重要。這個參數的預設值為1 首先需 ...
  • sql得到當前系統時間得 日期部分 CONVERT(varchar(10),getDate(),120) 昨天 select convert(varchar(10),getdate() - 1,120) 明天 select convert(varchar(10),getdate() + 1,120) ...
  • 【問題描述】 開發反饋有個應用在後端資料庫某次計劃性重啟後經常會出現資料庫連接異常問題,通過監控系統的埋點數據,發現應用連接資料庫異常有兩類表現:   其一:連接超時   131148.00ms Tomcat Connection Pool  &en ...
  • fork操作 fork操作是一個同步操作,若執行較慢會阻塞redis主線程 執行時間與記憶體量相關:記憶體越大,耗時越長;虛擬機較慢,真機較快。 查看fork執行時間,可做監控 info : latest_fork_usec 上一次執行fork的微秒數 優先使用物理機或者高效支持fork操作的虛擬化技術 ...
  • 1.認識JQ中ajax的封裝 jQ 對於ajax的封裝有兩層實現;$.ajax 為底層封裝實現;基於 $.ajax ,分別實現了$.get 與$.post 的高層封裝實現; 2.Ajax的底層實現基本語法: async: 布爾類型,代表是否非同步,true代表非同步,false同步,預設為true ca ...
  • js中substr和substring都是截取字元串中子串,非常相近,可以有一個或兩個參數。 語法:substr(start [,length]) 第一個字元的索引是0,start必選 length可選 substring(start [, end]) 第一個字元的索引是0,start必選 end可 ...
  • 符號生成器(Symbol Generator) 符號生成器(Symbol Generator)能夠生成三角形、十字架、菱形、圓形等符號,相關方法有: d3.svg.symbol() //創建一個符號生成器。 symbol(datum[,index]) //返回指定數據datum的路徑字元串 symb ...
  • video屬性介紹 iOS的屬性 playsinline On iPhone, video playsinline elements will now be allowed to play inline, and will not automatically enter fullscreen mod ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...