• <abbr id="chdyf"></abbr>
    <ruby id="chdyf"><acronym id="chdyf"><meter id="chdyf"></meter></acronym></ruby>
    <bdo id="chdyf"></bdo>
    <dfn id="chdyf"><menu id="chdyf"></menu></dfn>
    1. <menuitem id="chdyf"></menuitem><strong id="chdyf"><menu id="chdyf"></menu></strong>

      <rt id="chdyf"><menu id="chdyf"></menu></rt>
      成人小说一区二区三区,伊人精品成人久久综合全集观看,久久HEZYO色综合,中文字幕精品人妻熟女,影音先锋成人网站,我要看免费一级毛片,中国女人做爰A片,中文字幕av久久爽Av

      JavaScript防抖與節流,深入淺出,一本正經講透徹

      2021-9-29    前端達人

      目錄

      一、函數防抖(debounce)

      1. 什么是防抖?

      二.、函數節流

      2.1 定時器實現

      2.2 時間戳實現

      2.3 時間戳+定時器

      最后 


      一、函數防抖(debounce)

      1. 什么是防抖?

      函數防抖在頻繁觸發某一個事件時,一段時間內不再觸發該事件后才會去調用對應的回調函數,在設定間隔時間內如果下一次事件被觸發, 那么就重新開始定時器,直到事件觸發結束。

      規定時間內沒有繼續觸發事件的前提下,再去調用事件處理函數;

      具體如下面的例子所示:

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

        1.定義一個節流函數

        2.函數內部使用一個變量保存定時器

        3.返回一個函數,函數內部定義:如果定時器已經存在就清除定時器,重新設置定時器

        4.定義一個變量來接收debounce返回的函數

        5.在事件的回調函數中直接調用上一步的變量接收的方法


      二.、函數節流

      函數節流在事件持續觸發的前提下,保證一定時間段內只調用一次事件處理函數,就是函數節流;

      函數節流實現的方式定時器、時間戳、定時器+時間戳;

      2.1 定時器實現

      思路

      1.定義節流函數throttle

      2.定義timer保存定時器

      3.返回一個函數。函數內部定義:如果定時器不存在,設置定時器,間隔某一時間后將timer設置為null,如果在這之前事件再次觸發,則定時器中的回調無效

      <button>這是一個孤獨的按鈕</button> 
      
      
      1. /*
      2. * 定義定時器節流函數
      3. * func:傳入事件處理函數
      4. * delay:在delay指定的時間內定時器回調無效
      5. * */
      6. function throttle(func,delay) {
      7. let timer = null
      8. const context = this
      9. return function(...args){
      10. // 如果定時器不存在
      11. if(!timer){
      12. timer = setTimeout(()=>{
      13. func.apply(context,args) // 考慮返回的函數調用的環境,因此這里不直接使用this
      14. timer = null // delay之后清除定時器
      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 時間戳實現

      
      
      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 時間戳+定時器

      
      
      1. // 節流throttle代碼(時間戳+定時器):
      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));

      最后 

      想跟博主交朋友的可以查找,公_號?:前端老實人,跟博主一起探討學習哦?


      藍藍設計建立了UI設計分享群,每天會分享國內外的一些優秀設計,如果有興趣的話,可以進入一起成長學習,請掃碼藍小助,報下信息,藍小助會請您入群。歡迎您加入噢~~希望得到建議咨詢、商務合作,也請與我們聯系。

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

      轉自:csdn
      免責聲明:藍藍設計尊重原作者,文章的版權歸原作者。如涉及版權問題,請及時與我們取得聯系,我們立即更正或刪除。

      藍藍設計m.wtxcl.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務

      日歷

      鏈接

      個人資料

      藍藍設計的小編 http://m.wtxcl.cn

      存檔

      主站蜘蛛池模板: 鲁鲁AV| 国产 日韩 在线 亚洲 字幕 中文| 国产精品一区二区国产| 草1024榴社区入口成人| 亚洲欧美?va天堂人熟伦| jizz日本在线观看| 少妇人妻偷人精品视蜜桃| 国产欧美日韩精品一区二区三区 | 中文字幕+乱码+中文乱码91| 欧美三级网站| 中文字幕日本有码| 亚洲乱码精品一区二区| 国产v专区| 国模久久| 久久精品毛片av一区二区三区 | 98色色| jizz日本在线观看| 国产成人综合亚洲AV第一页| 国产精品午夜福利视频| 亚洲老熟女@TubeumTV| 无码少妇一区二区三区浪潮AV| 欧美日韩导航| 欧美色熟妇| 国产乱人伦AⅤ在线麻豆A| 国产乱妇无码毛片A片在线看下载| 欧美乱码精品一区二区| 无码中文字幕精品推荐| 亚洲av综合亚洲精品| 一本二本无码| 精品自拍视频| 五月丁香六月| 国产乱码一区二区三区| 日本亚洲a| 精品国产三级大全在线观看| 一区无码| 国产熟妇??码视频| 亚洲高清乱码午夜电影网| AV免费网站| 孟津县| 久久精品欧美一区二区| 国产黄a三级三级三级老年人|