国产成在线人视频免费视频-国产成综合-国产床上视频-国产大臿蕉香蕉大视频女-国产大尺度pr社18福利在线

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

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

目錄

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

1. 什么是防抖?

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

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

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

2.3 時間戳+定時器

最后 


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

1. 什么是防抖?

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

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

具體如下面的例子所示:


  1. /*定義防抖函數(shù)
  2. * func:傳入一個函數(shù),事件不再持續(xù)觸發(fā)時會調(diào)用該函數(shù)
  3. * delay:定義持續(xù)多久后執(zhí)行傳入的回調(diào)函數(shù)
  4. * */
  5. function debounce(func,delay) {
  6. let timer = null // 用于保存定時器
  7. return function (...args) {
  8. // 如果定時器存在,清除定時器,隨后重新設(shè)置timer
  9. if(timer !== null) clearTimeout(timer)
  10. timer = setTimeout(func, delay) // 超過delay為接收到事件會調(diào)用這里的func 必要的額時候可以修改func的this指向 由于timer對外部存在引用,因此不會被銷毀
  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ù),最多也不會多余下面的寫法執(zhí)行的次數(shù)
  23. window.addEventListener('scroll', testDeBounce); // 如果這樣寫的話,每當(dāng)頁面滾動就會調(diào)用事件處理函數(shù)
  • 總結(jié)一下思路

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

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

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

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

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


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

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

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

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

思路

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

2.定義timer保存定時器

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

<button>這是一個孤獨(dú)的按鈕</button> 

  1. /*
  2. * 定義定時器節(jié)流函數(shù)
  3. * func:傳入事件處理函數(shù)
  4. * delay:在delay指定的時間內(nèi)定時器回調(diào)無效
  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) // 考慮返回的函數(shù)調(diào)用的環(huán)境,因此這里不直接使用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 時間戳實(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 時間戳+定時器


  1. // 節(jié)流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));

最后 

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


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

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

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

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

日歷

鏈接

個人資料

存檔

主站蜘蛛池模板: 2017天天天天做夜夜夜做 | 我要看黄色一级毛片 | 一级特黄特色的免费大片视频 | 特级深夜a级毛片免费观看 特极毛片 | 偷看老师裙底无内裤福利图片 | 日本黄色大片在线观看 | 黄色免费视屏 | 亚洲色图综合图区 | 免费高清毛片在线播放视频 | 无码中文字幕日韩专区 | 三级视频欧美 | 中文字幕一区精品欧美 | 狠狠色丁香婷婷综合久久来 | 国产精品公开免费视频 | 国产精品日韩欧美亚洲另类 | 国产永久免费高清在线观看视频 | 国产不卡在线观看视频 | 成人性色大片 | 一级片一级毛片 | 一区二区三区视频免费观看 | 国产日韩在线 | 手机在线看片不卡中文字幕 | a毛片免费观看完整 | 91麻豆怎么进去 | 色男天堂 | 青青草伊人网 | 欧洲欧美人成免费观看 | 美国一级片视频 | 玖玖99视频 | 国产亚洲欧美另类一区二区三区 | 男女啪视频大全1000 | 草逼毛片| 久久国产香蕉视频 | 免费片 | 亚洲午夜精品一级在线 | 高清性色生活片免费观看 | 国产一区 在线视频 | chinese麻豆自制国产 | 70岁老妇女一级毛片爽 | 窝窝免费午夜视频一区二区 | 男女做污污无遮挡激烈免费 |