<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • JavaScript防抖與節(jié)流,深入淺出,一本正經(jīng)講透徹

          2021-9-29    前端達(dá)人

          目錄

          一、函數(shù)防抖(debounce)

          1. 什么是防抖?

          二.、函數(shù)節(jié)流

          2.1 定時(shí)器實(shí)現(xiàn)

          2.2 時(shí)間戳實(shí)現(xiàn)

          2.3 時(shí)間戳+定時(shí)器

          最后 


          一、函數(shù)防抖(debounce)

          1. 什么是防抖?

          函數(shù)防抖在頻繁觸發(fā)某一個(gè)事件時(shí),一段時(shí)間內(nèi)不再觸發(fā)該事件后才會(huì)去調(diào)用對應(yīng)的回調(diào)函數(shù),在設(shè)定間隔時(shí)間內(nèi)如果下一次事件被觸發(fā), 那么就重新開始定時(shí)器,直到事件觸發(fā)結(jié)束。

          規(guī)定時(shí)間內(nèi)沒有繼續(xù)觸發(fā)事件的前提下,再去調(diào)用事件處理函數(shù);

          具體如下面的例子所示:

          
          
          1. /*定義防抖函數(shù)
          2. * func:傳入一個(gè)函數(shù),事件不再持續(xù)觸發(fā)時(shí)會(huì)調(diào)用該函數(shù)
          3. * delay:定義持續(xù)多久后執(zhí)行傳入的回調(diào)函數(shù)
          4. * */
          5. function debounce(func,delay) {
          6. let timer = null // 用于保存定時(shí)器
          7. return function (...args) {
          8. // 如果定時(shí)器存在,清除定時(shí)器,隨后重新設(shè)置timer
          9. if(timer !== null) clearTimeout(timer)
          10. timer = setTimeout(func, delay) // 超過delay為接收到事件會(huì)調(diào)用這里的func 必要的額時(shí)候可以修改func的this指向 由于timer對外部存在引用,因此不會(huì)被銷毀
          11. }
          12. }
          13. /*事件處理函數(shù)*/
          14. function testDeBounce(){
          15. console.log('你看我執(zhí)行了幾次??')
          16. }
          17. // 接收debounce返回的函數(shù)
          18. const temp = debounce(testDeBounce(),1000)
          19. /*綁定事件,測試防抖函數(shù)*/
          20. window.addEventListener('scroll',()=>{
          21. temp()
          22. }); // 這樣寫最少調(diào)用一次事件處理函數(shù),最多也不會(huì)多余下面的寫法執(zhí)行的次數(shù)
          23. window.addEventListener('scroll', testDeBounce); // 如果這樣寫的話,每當(dāng)頁面滾動(dòng)就會(huì)調(diào)用事件處理函數(shù)
          • 總結(jié)一下思路

            1.定義一個(gè)節(jié)流函數(shù)

            2.函數(shù)內(nèi)部使用一個(gè)變量保存定時(shí)器

            3.返回一個(gè)函數(shù),函數(shù)內(nèi)部定義:如果定時(shí)器已經(jīng)存在就清除定時(shí)器,重新設(shè)置定時(shí)器

            4.定義一個(gè)變量來接收debounce返回的函數(shù)

            5.在事件的回調(diào)函數(shù)中直接調(diào)用上一步的變量接收的方法


          二.、函數(shù)節(jié)流

          函數(shù)節(jié)流在事件持續(xù)觸發(fā)的前提下,保證一定時(shí)間段內(nèi)只調(diào)用一次事件處理函數(shù),就是函數(shù)節(jié)流;

          函數(shù)節(jié)流實(shí)現(xiàn)的方式定時(shí)器、時(shí)間戳、定時(shí)器+時(shí)間戳;

          2.1 定時(shí)器實(shí)現(xiàn)

          思路

          1.定義節(jié)流函數(shù)throttle

          2.定義timer保存定時(shí)器

          3.返回一個(gè)函數(shù)。函數(shù)內(nèi)部定義:如果定時(shí)器不存在,設(shè)置定時(shí)器,間隔某一時(shí)間后將timer設(shè)置為null,如果在這之前事件再次觸發(fā),則定時(shí)器中的回調(diào)無效

          <button>這是一個(gè)孤獨(dú)的按鈕</button> 
          
          
          1. /*
          2. * 定義定時(shí)器節(jié)流函數(shù)
          3. * func:傳入事件處理函數(shù)
          4. * delay:在delay指定的時(shí)間內(nèi)定時(shí)器回調(diào)無效
          5. * */
          6. function throttle(func,delay) {
          7. let timer = null
          8. const context = this
          9. return function(...args){
          10. // 如果定時(shí)器不存在
          11. if(!timer){
          12. timer = setTimeout(()=>{
          13. func.apply(context,args) // 考慮返回的函數(shù)調(diào)用的環(huán)境,因此這里不直接使用this
          14. timer = null // delay之后清除定時(shí)器
          15. },delay)
          16. }
          17. }
          18. }
          19. function test() {
          20. console.log('啊啊啊!')
          21. }
          22. const temp = throttle(test,1000)
          23. document.querySelector('button').addEventListener('click',()=>{
          24. temp()
          25. })

          2.2 時(shí)間戳實(shí)現(xiàn)

          
          
          1. var throttle = function(func, delay) {
          2. var prev = Date.now();
          3. return function() {
          4. var context = this;
          5. var args = arguments;
          6. var now = Date.now();
          7. if (now - prev >= delay) {
          8. func.apply(context, args);
          9. prev = Date.now();
          10. }
          11. }
          12. }
          13. function handle() {
          14. console.log(Math.random());
          15. }
          16. window.addEventListener('scroll', throttle(handle, 1000));

          2.3 時(shí)間戳+定時(shí)器

          
          
          1. // 節(jié)流throttle代碼(時(shí)間戳+定時(shí)器):
          2. var throttle = function(func, delay) {
          3. var timer = null;
          4. var startTime = Date.now();
          5. return function() {
          6. var curTime = Date.now();
          7. var remaining = delay - (curTime - startTime);
          8. var context = this;
          9. var args = arguments;
          10. clearTimeout(timer);
          11. if (remaining <= 0) {
          12. func.apply(context, args);
          13. startTime = Date.now();
          14. } else {
          15. timer = setTimeout(func, remaining);
          16. }
          17. }
          18. }
          19. function handle() {
          20. console.log(Math.random());
          21. }
          22. window.addEventListener('scroll', throttle(handle, 1000));

          最后 

          想跟博主交朋友的可以查找,公_號(hào)?:前端老實(shí)人,跟博主一起探討學(xué)習(xí)哦?


          藍(lán)藍(lán)設(shè)計(jì)建立了UI設(shè)計(jì)分享群,每天會(huì)分享國內(nèi)外的一些優(yōu)秀設(shè)計(jì),如果有興趣的話,可以進(jìn)入一起成長學(xué)習(xí),請掃碼藍(lán)小助,報(bào)下信息,藍(lán)小助會(huì)請您入群。歡迎您加入噢~~希望得到建議咨詢、商務(wù)合作,也請與我們聯(lián)系。

          分享此文一切功德,皆悉回向給文章原作者及眾讀者.

          轉(zhuǎn)自:csdn
          免責(zé)聲明:藍(lán)藍(lán)設(shè)計(jì)尊重原作者,文章的版權(quán)歸原作者。如涉及版權(quán)問題,請及時(shí)與我們?nèi)〉寐?lián)系,我們立即更正或刪除。

          藍(lán)藍(lán)設(shè)計(jì)m.sdgs6788.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 平面設(shè)計(jì)服務(wù)

          日歷

          鏈接

          個(gè)人資料

          存檔

          亚洲国产精品无码久久| 老司机国内精品久久久久| 久久中文字幕精品| 91久久精一区二区三区大全| 一本大道加勒比久久综合| 伊人久久大香线蕉综合网站| 漂亮人妻被黑人久久精品| 久久精品国产只有精品66 | 国产高潮久久免费观看| 婷婷久久五月天| 国产激情久久久久影院老熟女免费| 国产精品久久久香蕉| 青青草国产精品久久| 无码人妻久久久一区二区三区| 精品久久人人妻人人做精品| 久久国产精品成人影院| 日韩亚洲国产综合久久久| 久久精品中文字幕久久| 亚洲国产精品成人久久| 亚洲欧洲久久久精品| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 精品免费tv久久久久久久| 国内精品伊人久久久久妇| 国产成人无码精品久久久免费| 精品乱码久久久久久夜夜嗨| 亚洲午夜无码AV毛片久久| 国产精品嫩草影院久久| 久久青青草原精品影院| 97精品国产91久久久久久| 久久亚洲美女精品国产精品| 狠狠色丁香久久婷婷综合蜜芽五月| 国产免费福利体检区久久| 国产精品99久久久久久董美香 | 久久人人爽人人人人片av| 色天使久久综合网天天| 久久亚洲精品国产亚洲老地址 | 国产免费久久精品99久久| 欧美日韩精品久久久免费观看| 久久久久国产一区二区| 热RE99久久精品国产66热| 一级A毛片免费观看久久精品|