• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    javascript函數的節流[throttle]與防抖[debounce]

    來源:懂視網 責編:小采 時間:2020-11-27 22:25:35
    文檔

    javascript函數的節流[throttle]與防抖[debounce]

    javascript函數的節流[throttle]與防抖[debounce]:防抖和節流 窗口的resize、scroll,輸入框內容校驗等操作時,如果這些操作處理函數較為復雜或頁面頻繁重渲染等操作時,如果事件觸發的頻率無限制,會加重瀏覽器的負擔,導致用戶體驗非常糟糕。此時我們可以采用debounce(防抖)和throttle(節流)的方
    推薦度:
    導讀javascript函數的節流[throttle]與防抖[debounce]:防抖和節流 窗口的resize、scroll,輸入框內容校驗等操作時,如果這些操作處理函數較為復雜或頁面頻繁重渲染等操作時,如果事件觸發的頻率無限制,會加重瀏覽器的負擔,導致用戶體驗非常糟糕。此時我們可以采用debounce(防抖)和throttle(節流)的方

    防抖和節流

    窗口的resize、scroll,輸入框內容校驗等操作時,如果這些操作處理函數較為復雜或頁面頻繁重渲染等操作時,如果事件觸發的頻率無限制,會加重瀏覽器的負擔,導致用戶體驗非常糟糕。此時我們可以采用debounce(防抖)和throttle(節流)的方式來減少觸發的頻率,同時又不影響實際效果。

    這兩個東西都是為了項目優化而出現的,官方是沒有具體定義的,他們的出現主要是為了解決一些短時間內連續執行的事件帶來性能上的不佳和內存的消耗巨大等問題;

    像這類事件一般像 scroll keyup mousemove resize等等,短時間內不斷的觸發,在性能上消耗是非常大的,尤其是一些改變DOM結構的操作;

    節流[throttle]與防抖[debounce]非常相似,都是讓上述這類事件在規定的事件從不斷的去觸發更改成為規定的時間內觸發多少次;

    節流[throttle]

    節流通俗來解釋就比如我們水龍頭放水,閥門一打開,水嘩嘩的往下流,這個秉著勤儉節約的優良傳統美德,我們要把水龍頭關小點,最好是如我們心意按照一定規律在某個時間間隔內一滴一滴的往下滴,這,,,好吧這就是我們節流的概念;

    換成函數來說,使用setTimeout方法,給定兩個時間,后面的時間減去前面的時間,到達我們給定的時間就去觸發一次這個事件,這么說太籠統的,我們看下面的函數,這里我們以【scroll】為例;

    /** 樣式我就順便寫了 **/
    <style>
     *{padding:0;margin:0;}
     .scroll-box{
     width : 100%;
     height : 500px;
     background:blue;
     overflow : auto;
     } 
     .scroll-item{
     height:1000px;
     width:100%;
     }
    </style>
    
    

    ------------------------

    /** 先給定DOM結構;**/
    <div class="scroll-box">
     <div class="scroll-item"></div>
    </div>
    
    

    ------------------------

    /**主要看js,為了簡單我用JQ去寫了**/
    <script>
     $(document).ready(function(){
     var scrollBox = $('.scroll-box');
     //調用throttle函數,傳入相應的方法和規定的時間;
     var thro = throttle(throFun,300);
     //觸發事件;
     scrollBox.on('scroll' , function(){
     //調用執行函數;
     thro();
     })
    
     // 封裝函數; 
     function throttle(method,time){
     var timer = null;
     var startTime = new Date();
     return function(){
     var context = this;
     var endTime = new Date();
     var resTime = endTime - startTime;
     //判斷大于等于我們給的時間采取執行函數;
     if(resTime >= time){
     method.call(context);
     //執行完函數之后重置初始時間,等于最后一次觸發的時間
     startTime = endTime;
     }
     }
     }
     function throFun(){
     console.log('success');
     }
     })
    </script>
    
    

    通過以上的函數,我們就可以做到節流的效果,在規定的每300毫秒觸發一次,當然時間可以自定義,根據需求來;

    防抖[debounce ]

    寫代碼之前,我們先清楚一下防抖的概念,不知道大家有沒有做過電腦端兩邊懸浮廣告窗口的這么一個東西,當我們拖動滾動條的時候,兩邊的廣告窗口會因為滾動條的拖動,而不斷的嘗試著去居于中間,然后你就會看到這兩個窗口,不停的抖啊抖;

    一般這種就叫抖動了,我們要做的就是防止這種抖動,稱為防抖[debounce ];

    那這里防抖思想就是當我們拖動完成之后,兩邊的窗口位置再重新去計算,這樣,就會顯得很平滑,看著很舒服了,最主要的操作DOM結構的次數就大大減少了;

    優化了頁面性能,降低了內存消耗,不然你像IE這種比較老點版本的瀏覽器,說不定就直接給你蹦了

    用書面一點的說法就是,在某個事件沒有結束之前,函數不會執行,當結束之后,我們給定延時時間,然他在給定的延時時間之后再去執行這個函數,這就是防抖函數;

    來看代碼:

    //將上面的throttle函數替換為debounce函數;
    function debounce(method,time){
     var timer = null ;
     return function(){
     var context = this;
     //在函數執行的時候先清除timer定時器;
     clearTimeout(timer);
     timer = setTimeout(function(){
     method.call(context);
     },time);
     }
    }
    

    思路就是在函數執行之前,我們先清除定時器,如果函數一直執行,就會不斷的去清除定時器中的方法,知道我們操作結束之后,函數才會執行;

    其實書寫的方式有很多,主要還是思路的問題,大家寫的多了,自然就知道了;

    用途

    1. 當我們做keyup像后臺請求檢驗的時候,可以使用防抖函數,不然我們每按一次鍵盤就請求一次,請求太頻繁,這樣當我們結束按鍵盤的時候再去請求,請求少很多了,性能自然不用說;
    2. resize 窗口大小調整的時候,我們可以采用防抖技術也可以使用節流;
    3. mousemove 鼠標移動事件我們既可以采用防抖也可以使用節流;
    4. scroll 滾動條觸發的事件,當然既可以采用防抖也可以采用節流;
    5. 連續高頻發的事件都可以采用這兩種方式去解決,優化頁面性能;

    具體的采用哪一種更較為合適,主要還是看你的業務需求,好了,本篇就到這里了,感謝大家閱讀;希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    javascript函數的節流[throttle]與防抖[debounce]

    javascript函數的節流[throttle]與防抖[debounce]:防抖和節流 窗口的resize、scroll,輸入框內容校驗等操作時,如果這些操作處理函數較為復雜或頁面頻繁重渲染等操作時,如果事件觸發的頻率無限制,會加重瀏覽器的負擔,導致用戶體驗非常糟糕。此時我們可以采用debounce(防抖)和throttle(節流)的方
    推薦度:
    標簽: js 函數 javascript
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 久久97久久97精品免视看秋霞| 香港三级精品三级在线专区| 国产精品偷窥熟女精品视频| 久久久精品人妻一区二区三区蜜桃| 国产日韩精品无码区免费专区国产 | 国产乱人伦偷精品视频| 精品国产精品国产偷麻豆| 欧美精品亚洲人成在线观看| 国产精品 羞羞答答在线| 精品国内片67194| 日韩av无码久久精品免费| 下载天堂国产AV成人无码精品网站| 精品欧美激情在线看| 国产成人高清精品一区二区三区| 国产精品亚洲专区在线观看| 国语精品一区二区三区| 无码国产精品一区二区免费式芒果 | 无码精品一区二区三区免费视频| 99热国内精品| 国产l精品国产亚洲区在线观看| 久久久久亚洲精品天堂| 伊在人亚洲香蕉精品区麻豆| 亚洲?V无码乱码国产精品| 麻豆精品| 亚洲精品动漫免费二区| 欧美日韩国产成人高清视频,欧美日韩在线精品一 | 蜜臀久久99精品久久久久久小说| 四虎国产精品成人免费久久| 欧美精品黑人粗大视频| 日产精品久久久久久久性色| 国产综合成人色产三级高清在线精品发布| 欧美黑人巨大精品| 嫩草影院久久国产精品| 99精品国产丝袜在线拍国语| 久久久久无码精品国产| 亚洲AV无码精品色午夜果冻不卡| 亚洲精品自产拍在线观看| 一夲道无码人妻精品一区二区| 亚洲精品专区| 亚洲AV永久无码精品一百度影院| 亚洲精品乱码久久久久久|