<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        javascript函數(shù)的節(jié)流[throttle]與防抖[debounce]

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:25:35
        文檔

        javascript函數(shù)的節(jié)流[throttle]與防抖[debounce]

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

        防抖和節(jié)流

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

        這兩個(gè)東西都是為了項(xiàng)目優(yōu)化而出現(xiàn)的,官方是沒有具體定義的,他們的出現(xiàn)主要是為了解決一些短時(shí)間內(nèi)連續(xù)執(zhí)行的事件帶來性能上的不佳和內(nèi)存的消耗巨大等問題;

        像這類事件一般像 scroll keyup mousemove resize等等,短時(shí)間內(nèi)不斷的觸發(fā),在性能上消耗是非常大的,尤其是一些改變DOM結(jié)構(gòu)的操作;

        節(jié)流[throttle]與防抖[debounce]非常相似,都是讓上述這類事件在規(guī)定的事件從不斷的去觸發(fā)更改成為規(guī)定的時(shí)間內(nèi)觸發(fā)多少次;

        節(jié)流[throttle]

        節(jié)流通俗來解釋就比如我們水龍頭放水,閥門一打開,水嘩嘩的往下流,這個(gè)秉著勤儉節(jié)約的優(yōu)良傳統(tǒng)美德,我們要把水龍頭關(guān)小點(diǎn),最好是如我們心意按照一定規(guī)律在某個(gè)時(shí)間間隔內(nèi)一滴一滴的往下滴,這,,,好吧這就是我們節(jié)流的概念;

        換成函數(shù)來說,使用setTimeout方法,給定兩個(gè)時(shí)間,后面的時(shí)間減去前面的時(shí)間,到達(dá)我們給定的時(shí)間就去觸發(fā)一次這個(gè)事件,這么說太籠統(tǒng)的,我們看下面的函數(shù),這里我們以【scroll】為例;

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

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

        /** 先給定DOM結(jié)構(gòu);**/
        <div class="scroll-box">
         <div class="scroll-item"></div>
        </div>
        
        

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

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

        通過以上的函數(shù),我們就可以做到節(jié)流的效果,在規(guī)定的每300毫秒觸發(fā)一次,當(dāng)然時(shí)間可以自定義,根據(jù)需求來;

        防抖[debounce ]

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

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

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

        優(yōu)化了頁面性能,降低了內(nèi)存消耗,不然你像IE這種比較老點(diǎn)版本的瀏覽器,說不定就直接給你蹦了

        用書面一點(diǎn)的說法就是,在某個(gè)事件沒有結(jié)束之前,函數(shù)不會執(zhí)行,當(dāng)結(jié)束之后,我們給定延時(shí)時(shí)間,然他在給定的延時(shí)時(shí)間之后再去執(zhí)行這個(gè)函數(shù),這就是防抖函數(shù);

        來看代碼:

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

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

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

        用途

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

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

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        javascript函數(shù)的節(jié)流[throttle]與防抖[debounce]

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

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 女人让男人免费桶爽30分钟| 国产成人午夜精品免费视频| 特级毛片爽www免费版| 国产成人精品亚洲一区| 伊人免费在线观看高清版| 中文字幕免费观看| 永久免费观看的毛片的网站| 久久国产成人亚洲精品影院| 亚洲伊人tv综合网色| 亚洲色大成网站www永久男同| 黄色一级视频免费| 国产国产人免费视频成69堂| 久久久久亚洲av成人无码电影| eeuss免费天堂影院| 99久久99久久精品免费看蜜桃 | 中文字幕看片在线a免费| 国产免费不卡v片在线观看| 亚洲视频一区二区三区四区| 怡红院免费的全部视频| 亚洲成人精品久久| 色多多www视频在线观看免费| 亚洲午夜精品第一区二区8050| 亚洲日韩乱码中文字幕| 亚洲综合免费视频| 亚洲色精品vr一区二区三区| 亚洲JLZZJLZZ少妇| 亚洲精品免费网站| 亚洲精品天天影视综合网| 一个人看的免费视频www在线高清动漫 | AAAAA级少妇高潮大片免费看| 青青青国产免费一夜七次郎| 四虎成人精品国产永久免费无码| 亚洲美女又黄又爽在线观看| 亚洲视频免费在线播放| 美女视频免费看一区二区| 亚洲成A人片在线观看无码不卡| 国产精品小视频免费无限app | 亚洲一区二区三区成人网站 | 免费看片免费播放| 久久精品无码免费不卡| 亚洲精品人成电影网|