• <noscript id="ggggg"><dd id="ggggg"></dd></noscript>
    <small id="ggggg"></small> <sup id="ggggg"></sup>
    <noscript id="ggggg"><dd id="ggggg"></dd></noscript>
    <tfoot id="ggggg"></tfoot>
  • <nav id="ggggg"><cite id="ggggg"></cite></nav>
    <nav id="ggggg"></nav>
    成人黃色A片免费看三更小说,精品人妻av区波多野结衣,亚洲第一极品精品无码,欧美综合区自拍亚洲综合,久久99青青精品免费观看,中文字幕在线中字日韩 ,亚洲国产精品18久久久久久,黄色在线免费观看

    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)用對(duì)應(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對(duì)外部存在引用,因此不會(huì)被銷毀
    11. }
    12. }
    13. /*事件處理函數(shù)*/
    14. function testDeBounce(){
    15. console.log('你看我執(zhí)行了幾次??')
    16. }
    17. // 接收debounce返回的函數(shù)
    18. const temp = debounce(testDeBounce(),1000)
    19. /*綁定事件,測(cè)試防抖函數(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ì)分享國(guó)內(nèi)外的一些優(yōu)秀設(shè)計(jì),如果有興趣的話,可以進(jìn)入一起成長(zhǎng)學(xué)習(xí),請(qǐng)掃碼藍(lán)小助,報(bào)下信息,藍(lán)小助會(huì)請(qǐng)您入群。歡迎您加入噢~~希望得到建議咨詢、商務(wù)合作,也請(qǐng)與我們聯(lián)系。

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

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

    藍(lán)藍(lán)設(shè)計(jì)www.lzhte.cn )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(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è)人資料

    存檔

    主站蜘蛛池模板: 国产操逼视频| 久久婷婷五月综合色国产免费观看| 久久99国产精品尤物 | 天堂а√中文在线官网| 日韩精品无码不卡无码| 亚洲在战AV极品无码| 92国产精品午夜免费福利视频 | 亚洲va在线va天堂va四虎 | 最新无码专区在线视频动态| 亚洲VA在线VA天堂VA不卡| 国产精品国产三级国产AV品爱网| 富源县| 浪潮AV激情高潮国产精品| 丰满的少妇人妻无码区| 国模冰冰高清炮轰图150p| 久久久久中文伊人久久久| 亚洲 一区二区 在线| 亚洲一区二区偷拍精品| 美女被躁出白浆视频播放 | 欧美成人精品一级在线观看| 欧美日韩国内精品麻豆91| 超碰福利电影| 久久综合亚洲色一区二区三区| 日韩中文字幕在线一区二区三区| 亚洲AV无码精品色午夜果冻不卡| 亚洲最大成人免费av| 91欧洲在线视精品在亚洲| 亚洲中文精品一区二区| 97人人超碰国产精品最新| 吾爱夜趣福利在线导航观看 | 成年男人裸j照无遮挡无码| 蜜桃福利导航| 三级视频网址| 国产真实伦视频在线视频| 国产午夜精品久久久久小说| 日韩精品欧美精品中文精品| 日韩综合色| 精品亚洲精品日韩精品| 国产一级一级毛片永久| 亚洲AV日韩精品久久久久| 99久热RE在线精品视频|