92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线

詳談js防抖和節流

2021-5-8    前端達人

本文由小芭樂發表

0. 引入

首先舉一個例子:

模擬在輸入框輸入后做ajax查詢請求,沒有加入防抖和節流的效果,這里附上完整可執行代碼:

<!DOCTYPE html> <html lang="en">  <head> <meta charset="UTF-8"> <title>沒有防抖</title> <style type="text/css"></style> <script type="text/javascript"> window.onload = function () { //模擬ajax請求  function ajax(content) { console.log('ajax request ' + content) } let inputNormal = document.getElementById('normal');  inputNormal.addEventListener('keyup', function (e) { ajax(e.target.value) }) } </script> </head>  <body> <div> 1.沒有防抖的輸入 <input type="text" name="normal" id="normal"> </div> </body>  </html> 

效果:在輸入框里輸入一個,就會觸發一次“ajax請求”(此處是console)。


沒有防抖和節流

缺點:浪費請求資源,可以加入防抖和節流來優化一下。

本文會分別介紹什么是防抖和節流,它們的應用場景,和實現方式。防抖和節流都是為了解決短時間內大量觸發某函數而導致的性能問題,比如觸發頻率過高導致的響應速度跟不上觸發頻率,出現延遲,假死或卡頓的現象。但二者應對的業務需求不一樣,所以實現的原理也不一樣,下面具體來看看吧。

1. 防抖(debounce)

1.1 什么是防抖

在事件被觸發n秒后再執行回調函數,如果在這n秒內又被觸發,則重新計時。

1.2 應用場景

(1) 用戶在輸入框中連續輸入一串字符后,只會在輸入完后去執行最后一次的查詢ajax請求,這樣可以有效減少請求次數,節約請求資源;

(2) window的resize、scroll事件,不斷地調整瀏覽器的窗口大小、或者滾動時會觸發對應事件,防抖讓其只觸發一次;

1.3 實現

還是上述列子,這里加入防抖來優化一下,完整代碼如下:

<!DOCTYPE html> <html lang="en">  <head> <meta charset="UTF-8"> <title>加入防抖</title> <style type="text/css"></style> <script type="text/javascript"> window.onload = function () { //模擬ajax請求  function ajax(content) { console.log('ajax request ' + content) } function debounce(fun, delay) { return function (args) { //獲取函數的作用域和變量  let that = this let _args = args //每次事件被觸發,都會清除當前的timeer,然后重寫設置超時調用  clearTimeout(fun.id) fun.id = setTimeout(function () { fun.call(that, _args) }, delay) } } let inputDebounce = document.getElementById('debounce') let debounceAjax = debounce(ajax, 500) inputDebounce.addEventListener('keyup', function (e) { debounceAjax(e.target.value) }) } </script> </head>  <body> <div> 2.加入防抖后的輸入 <input type="text" name="debounce" id="debounce"> </div> </body>  </html> 

代碼說明:

1.每一次事件被觸發,都會清除當前的 timer 然后重新設置超時調用,即重新計時。 這就會導致每一次高頻事件都會取消前一次的超時調用,導致事件處理程序不能被觸發;

2.只有當高頻事件停止,最后一次事件觸發的超時調用才能在delay時間后執行;

效果:

加入防抖后,當持續在輸入框里輸入時,并不會發送請求,只有當在指定時間間隔內沒有再輸入時,才會發送請求。如果先停止輸入,但是在指定間隔內又輸入,會重新觸發計時。


加入防抖

2.節流(throttle)

2.1 什么是節流

規定一個單位時間,在這個單位時間內,只能有一次觸發事件的回調函數執行,如果在同一個單位時間內某事件被觸發多次,只有一次能生效。

2.2 應用場景

(1)鼠標連續不斷地觸發某事件(如點擊),只在單位時間內只觸發一次;

(2)在頁面的無限加載場景下,需要用戶在滾動頁面時,每隔一段時間發一次 ajax 請求,而不是在用戶停下滾動頁面操作時才去請求數據;

(3)監聽滾動事件,比如是否滑到底部自動加載更多,用throttle來判斷;

2.3 實現

還是上述列子,這里加入節流來優化一下,完整代碼如下:

<!DOCTYPE html> <html lang="en">  <head> <meta charset="UTF-8"> <title>加入節流</title> <style type="text/css"></style> <script type="text/javascript"> window.onload = function () { //模擬ajax請求  function ajax(content) { console.log('ajax request ' + content) }  function throttle(fun, delay) { let last, deferTimer return function (args) { let that = this; let _args = arguments;  let now = +new Date(); if (last && now < last + delay) { clearTimeout(deferTimer); deferTimer = setTimeout(function () { last = now; fun.apply(that, _args); }, delay) } else { last = now; fun.apply(that, _args); } } } let throttleAjax = throttle(ajax, 1000) let inputThrottle = document.getElementById('throttle') inputThrottle.addEventListener('keyup', function (e) { throttleAjax(e.target.value) }) } </script> </head>  <body> <div> 3.加入節流后的輸入 <input type="text" name="throttle" id="throttle"> </div> </body>  </html> 

效果:實驗可發現在持續輸入時,會安裝代碼中的設定,每1秒執行一次ajax請求


加入節流

3. 小結

總結下防抖和節流的區別:

-- 效果:

函數防抖是某一段時間內只執行一次;而函數節流是間隔時間執行,不管事件觸發有多頻繁,都會保證在規定時間內一定會執行一次真正的事件處理函數。

-- 原理:

防抖是維護一個計時器,規定在delay時間后觸發函數,但是在delay時間內再次觸發的話,都會清除當前的 timer 然后重新設置超時調用,即重新計時。這樣一來,只有最后一次操作能被觸發。

節流是通過判斷是否到達一定時間來觸發函數,若沒到規定時間則使用計時器延后,而下一次事件則會重新設定計時器。

如有問題,歡迎指正。


轉自知乎  原文鏈接:https://zhuanlan.zhihu.com/p/51608574



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

日歷

鏈接

個人資料

藍藍設計的小編 http://m.skdbbs.com

存檔

92国产精品视频_亚洲a级在线观看_国产精品电影观看_国产精品免费观看在线_精品伊人久久97_亚洲人成在线观_尤物九九久久国产精品的特点_成人激情在线播放_成人黄色大片在线免费观看_亚洲成人精品久久久_久久免费视频在线观看_久久精品国产一区_国产一区二区三区18_亚洲欧美中文字幕在线一区_日韩美女中文字幕_日韩视频免费在线
国产精品理伦片| 欧美网站在线观看| 成人国产在线视频| 欧美成人精品一区二区| 波多野结衣在线aⅴ中文字幕不卡| 午夜精品久久久久久久久久| 中文字幕免费一区二区三区| 美女www一区二区| 日韩一区二区三区免费播放| 国产aⅴ精品一区二区三区黄| 亚洲成人tv| 91免费福利视频| 欧洲国内综合视频| 在线观看免费一区二区| 久久av一区二区三区亚洲| 68精品国产免费久久久久久婷婷| 免费久久久一本精品久久区| 日韩三级视频中文字幕| 国产精品毛片久久久久久久久久99999999| 国产精品扒开做爽爽爽的视频| 婷婷丁香久久| 91精品国产91久久久| 亚洲视频免费在线| 精品国产乱码久久久久久蜜臀| 亚洲国产日韩a在线播放| 欧洲在线视频一区| 欧美二区三区的天堂| 66m—66摸成人免费视频| 欧美综合激情| 欧美精品一区二区三区四区| 99riav视频在线观看| 婷婷另类小说| 91视频91自| 3d性欧美动漫精品xxxx软件| 天天做天天爱天天综合网2021| 欧洲在线视频一区| 久久丝袜视频| 91精品国产品国语在线不卡| 国产精品日韩欧美大师| 亚洲a在线视频| 国产精选一区二区| 欧美一级片在线| 久草在线在线精品观看| 午夜亚洲性色福利视频| 亚洲国产成人午夜在线一区| 黄色一区三区| 久久国产生活片100| 国产精品视频成人| 免费看的黄色欧美网站| 狠狠久久五月精品中文字幕| 欧美经典一区二区| 欧美性生活一级片| 第一视频专区在线| 中文字幕免费一区| 在线成人免费网站| 视频一区二区综合| 国产激情一区二区三区| 狼狼综合久久久久综合网| 日韩欧美电影一区二区| 伊人久久大香线蕉av超碰演员| 成人99免费视频| 欧美情侣在线播放| 日韩亚洲国产中文字幕欧美| 午夜亚洲福利在线老司机| 国产精品青草久久久久福利99| 麻豆最新免费在线视频| 中文字幕在线视频区| 69av成年福利视频| 亚洲丝袜精品丝袜在线| 欧美另类高清视频在线| 欧美日韩一区二区三区免费看| 久久久女人电视剧免费播放下载| 中文字幕中文字幕一区二区| 亚洲欧洲精品成人久久奇米网| 欧美国产大片| 色综合久久久久综合99| 激情伊人五月天久久综合| 亚洲自拍另类欧美丝袜| 日本女优一区| 日韩福利一区| 精品国产欧美日韩| 久久久久久久久免费视频| 欧美一级免费视频| www.成人网.com| 亚洲爽爆av| 国产精品视频一区二区三区综合| 欧美日韩在线精品一区二区三区激情综合| 国产精品不卡| 中文字幕精品影院| 色婷婷精品久久二区二区蜜臂av| 五月婷婷一区| 欧美在线免费观看视频| yiren22亚洲综合| 欧美性猛交xxx高清大费中文| 亚洲精品韩国| 51久久精品夜色国产麻豆| 国产福利小视频在线观看| 久久久久亚洲综合| 欧美久久精品一级c片| 四虎成人精品永久免费av九九| 欧美猛男男男激情videos| 蜜桃av噜噜一区二区三区小说| 亚洲色图校园春色| 色综合久久久久久久久五月| 久久亚洲一区二区三区四区| 国产精品18久久久久久首页狼| 成人免费午夜电影| 国产亚洲精品久久久久久| 久久成人羞羞网站| 亚洲精品一区在线观看| 国产精品久久一卡二卡| 日韩和欧美的一区| 亚洲第一福利视频在线| 色婷婷av一区二区三区之一色屋| 国产欧美最新羞羞视频在线观看| 日韩欧美在线免费观看| 久久精品免视看国产成人| 7777精品伊人久久久大香线蕉完整版| 一区二区三区欧美在线观看| www日韩tube| 国产精品一区二区av交换| 欧美黑人狂野猛交老妇| youjizz在线播放| 成人免费视频网| 伊人男人综合视频网| 欧美成人精品激情在线观看| 在线观看成人免费视频| 日韩午夜在线| 日本一区二区中文字幕| 国产午夜精品一区二区| 国产精品灌醉下药二区| 国内精品视频在线播放| 精品一区精品二区| 不卡av在线免费观看| 色婷婷香蕉在线一区二区| 国产精品一级片在线观看| 综合亚洲视频| 91精品一区二区三区综合| 亚洲精品在线影院| 香港成人在线视频| 日韩精品视频免费| 国产一区二区三区的电影| 中文字幕视频精品一区二区三区| 欧美日韩精品一区二区三区蜜桃| 精品国产一区二区三区日日嗨| 欧美肥妇毛茸茸| 色播五月综合| 精品国产鲁一鲁****| 亚洲午夜电影在线观看| 麻豆精品在线观看| freemovies性欧美| 日韩av不卡一区| 亚洲男人天堂网| 青春草视频在线| 欧美大成色www永久网站婷| 久久艹在线视频| 欧美日韩国产综合新一区| 一区二区三区精品99久久| 91久久精品日日躁夜夜躁国产| 国产精品久久久久久久久久ktv| 免费看精品久久片| 91蜜桃在线免费视频| 91网站视频在线观看| 亚洲3p在线观看|