真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

JavaScript中怎么實(shí)現(xiàn)防抖和節(jié)流-創(chuàng)新互聯(lián)

這篇文章給大家介紹JavaScript中怎么實(shí)現(xiàn)防抖和節(jié)流,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

六盤水ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

首先舉一個(gè)例子:

模擬在輸入框輸入后做ajax查詢請(qǐng)求,沒(méi)有加入防抖和節(jié)流的效果,這里附上完整可執(zhí)行代碼:





 
 沒(méi)有防抖
 
 
 window.onload = function () {
 //模擬ajax請(qǐng)求
 function ajax(content) {
 console.log('ajax request ' + content)
 }
 let inputNormal = document.getElementById('normal');

 inputNormal.addEventListener('keyup', function (e) {
 ajax(e.target.value)
 })
 }
 



 
 1.沒(méi)有防抖的輸入:    

效果:在輸入框里輸入一個(gè),就會(huì)觸發(fā)一次“ajax請(qǐng)求”(此處是console)。

JavaScript中怎么實(shí)現(xiàn)防抖和節(jié)流

沒(méi)有防抖和節(jié)流

缺點(diǎn):浪費(fèi)請(qǐng)求資源,可以加入防抖和節(jié)流來(lái)優(yōu)化一下。

本文會(huì)分別介紹什么是防抖和節(jié)流,它們的應(yīng)用場(chǎng)景,和實(shí)現(xiàn)方式。防抖和節(jié)流都是為了解決短時(shí)間內(nèi)大量觸發(fā)某函數(shù)而導(dǎo)致的性能問(wèn)題,比如觸發(fā)頻率過(guò)高導(dǎo)致的響應(yīng)速度跟不上觸發(fā)頻率,出現(xiàn)延遲,假死或卡頓的現(xiàn)象。但二者應(yīng)對(duì)的業(yè)務(wù)需求不一樣,所以實(shí)現(xiàn)的原理也不一樣,下面具體來(lái)看看吧。

1. 防抖(debounce)

1.1 什么是防抖

在事件被觸發(fā)n秒后再執(zhí)行回調(diào)函數(shù),如果在這n秒內(nèi)又被觸發(fā),則重新計(jì)時(shí)。

1.2 應(yīng)用場(chǎng)景

(1) 用戶在輸入框中連續(xù)輸入一串字符后,只會(huì)在輸入完后去執(zhí)行最后一次的查詢ajax請(qǐng)求,這樣可以有效減少請(qǐng)求次數(shù),節(jié)約請(qǐng)求資源;

(2) window的resize、scroll事件,不斷地調(diào)整瀏覽器的窗口大小、或者滾動(dòng)時(shí)會(huì)觸發(fā)對(duì)應(yīng)事件,防抖讓其只觸發(fā)一次;

1.3 實(shí)現(xiàn)

還是上述列子,這里加入防抖來(lái)優(yōu)化一下,完整代碼如下:





 
 加入防抖
 
 
 window.onload = function () {
  //模擬ajax請(qǐng)求
  function ajax(content) {
  console.log('ajax request ' + content)
  }
  function debounce(fun, delay) {
  return function (args) {
   //獲取函數(shù)的作用域和變量
   let that = this
   let _args = args
   //每次事件被觸發(fā),都會(huì)清除當(dāng)前的timeer,然后重寫設(shè)置超時(shí)調(diào)用
   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)
  })
 }
 



 
 2.加入防抖后的輸入:    

代碼說(shuō)明:

1.每一次事件被觸發(fā),都會(huì)清除當(dāng)前的 timer 然后重新設(shè)置超時(shí)調(diào)用,即重新計(jì)時(shí)。 這就會(huì)導(dǎo)致每一次高頻事件都會(huì)取消前一次的超時(shí)調(diào)用,導(dǎo)致事件處理程序不能被觸發(fā);

2.只有當(dāng)高頻事件停止,最后一次事件觸發(fā)的超時(shí)調(diào)用才能在delay時(shí)間后執(zhí)行;

效果:

加入防抖后,當(dāng)持續(xù)在輸入框里輸入時(shí),并不會(huì)發(fā)送請(qǐng)求,只有當(dāng)在指定時(shí)間間隔內(nèi)沒(méi)有再輸入時(shí),才會(huì)發(fā)送請(qǐng)求。如果先停止輸入,但是在指定間隔內(nèi)又輸入,會(huì)重新觸發(fā)計(jì)時(shí)。

JavaScript中怎么實(shí)現(xiàn)防抖和節(jié)流

加入防抖

2.節(jié)流(throttle)

2.1 什么是節(jié)流

規(guī)定一個(gè)單位時(shí)間,在這個(gè)單位時(shí)間內(nèi),只能有一次觸發(fā)事件的回調(diào)函數(shù)執(zhí)行,如果在同一個(gè)單位時(shí)間內(nèi)某事件被觸發(fā)多次,只有一次能生效。

2.2 應(yīng)用場(chǎng)景

(1)鼠標(biāo)連續(xù)不斷地觸發(fā)某事件(如點(diǎn)擊),只在單位時(shí)間內(nèi)只觸發(fā)一次;

(2)在頁(yè)面的無(wú)限加載場(chǎng)景下,需要用戶在滾動(dòng)頁(yè)面時(shí),每隔一段時(shí)間發(fā)一次 ajax 請(qǐng)求,而不是在用戶停下滾動(dòng)頁(yè)面操作時(shí)才去請(qǐng)求數(shù)據(jù);

(3)監(jiān)聽滾動(dòng)事件,比如是否滑到底部自動(dòng)加載更多,用throttle來(lái)判斷;

2.3 實(shí)現(xiàn)

還是上述列子,這里加入節(jié)流來(lái)優(yōu)化一下,完整代碼如下:





 
 加入節(jié)流
 
 
 window.onload = function () {
  //模擬ajax請(qǐng)求
  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)
  })
 }
 



 
 3.加入節(jié)流后的輸入:    

效果:實(shí)驗(yàn)可發(fā)現(xiàn)在持續(xù)輸入時(shí),會(huì)安裝代碼中的設(shè)定,每1秒執(zhí)行一次ajax請(qǐng)求

JavaScript中怎么實(shí)現(xiàn)防抖和節(jié)流

加入節(jié)流

3. 小結(jié)

總結(jié)下防抖和節(jié)流的區(qū)別:

-- 效果:

函數(shù)防抖是某一段時(shí)間內(nèi)只執(zhí)行一次;而函數(shù)節(jié)流是間隔時(shí)間執(zhí)行,不管事件觸發(fā)有多頻繁,都會(huì)保證在規(guī)定時(shí)間內(nèi)一定會(huì)執(zhí)行一次真正的事件處理函數(shù)。

-- 原理:

防抖是維護(hù)一個(gè)計(jì)時(shí)器,規(guī)定在delay時(shí)間后觸發(fā)函數(shù),但是在delay時(shí)間內(nèi)再次觸發(fā)的話,都會(huì)清除當(dāng)前的 timer 然后重新設(shè)置超時(shí)調(diào)用,即重新計(jì)時(shí)。這樣一來(lái),只有最后一次操作能被觸發(fā)。

節(jié)流是通過(guò)判斷是否到達(dá)一定時(shí)間來(lái)觸發(fā)函數(shù),若沒(méi)到規(guī)定時(shí)間則使用計(jì)時(shí)器延后,而下一次事件則會(huì)重新設(shè)定計(jì)時(shí)器。

關(guān)于JavaScript中怎么實(shí)現(xiàn)防抖和節(jié)流就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。


網(wǎng)站標(biāo)題:JavaScript中怎么實(shí)現(xiàn)防抖和節(jié)流-創(chuàng)新互聯(lián)
鏈接分享:http://weahome.cn/article/csooph.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部