js函數的節流與防抖

1、防抖&節流

  在前端開發中有一部分用戶行爲會頻繁的觸發事件執行,而對於DOM的操做、資源加載等耗費性能的處理,極可能會致使界面卡頓,甚至瀏覽器奔潰。函數的節流與防抖就是爲了解決相似需求而產生的。前端

  1)節流ajax

    概念:函數的節流就是預約一個函數只有在大於等於執行週期時纔會執行,週期內調用不會執行。好像一滴水只有積攢到必定重量纔會落下同樣。瀏覽器

    場景:窗口調整(resize)、頁面滾動(scroll)、搶購瘋狂點擊(movedown)服務器

    故事:阿里巴巴月餅門事件,中秋來臨,阿里特地作了一個活動,搶月餅,可是每一個人只能搶購一盒,有五位工程師寫了js腳本,相似於12306的搶票軟件,直接刷了一百多盒月餅,結果被開除了四個.其實對於他們來講並非什麼壞事,不知道有多少公司對他們敞開大門~那麼如何解決這種問題呢,就用到了函數的節流app

  1.1)案例(限時搶購)函數

    我寫了這樣一個簡單的事件,以下性能

HTML:
1
<button id='show'>搶購</button> 2 <div id="box">0</div>
JS:
1
let oBtn=document.getElementById('show') 2 let oBox=document.getElementById('box') 3 oBtn.onclick=function(){ 4   oBox.innerText=parseInt(oBox.innerText)+1 5 }

    當我點擊時,每點擊一次,數量增長一,點擊越快,增長越快,效果圖以下:this

    

  1.2)腳本攻擊:這種簡單的數量增長很容易遭到腳本的攻擊,從而形成很大的損失。代碼以下spa

    for(let i=0;i<100;i++){oBtn.click()}code

    效果圖以下:

    

  1.3)如何解決(節流)

    上面並非咱們想要的結果,咱們想要的是在規定時間內只能執行一次,好比1秒內只能執行一次.不管你點擊多少次.

HTML:
1
<button id='show'>搶購</button> 2 <div id="box">0</div>
 JS:
1
let oBtn=document.getElementById('show'); 2 let oBox=document.getElementById('box'); 3 /* 4 handle:buy函數 5 wait:規定在一秒鐘內只能執行一次 6 */ 7 function throttle (handle, wait) { 8 let lastTime = 0; 9 return function (e) { 10 let nowTime = new Date().getTime() 11 if (nowTime - lastTime > wait) { 12 handle(); 13 lastTime = nowTime; 14 } 15 } 16 } 17 function buy(){ 18 oBox.innerText = parseInt(oBox.innerText)+1 19 } 20 oBtn.onclick = throttle(buy, 1000)

    效果圖以下:

    這樣不只能夠達到想要的效果,還能夠阻止惡意腳本的攻擊.

  

  2.防抖

    概念:函數防抖就是函數須要頻繁觸發狀況時,只有足夠空閒的時候,纔會執行一次。好像公交司機會等人都上車後纔會開車同樣.

    場景:實時搜索(keyup)、拖拽(mousemove)

    2.1).案例(實時搜索)

      在以前看一下這個過程圖,百度的實時搜索.

 

      在搜索nba的時候,並非每輸入一個字符,都會想服務器請求一次,而是在輸入完成後發出一次請求。

HTML:
1
<input type='text' id='ipt'/>
JS:
1
let oIpt = document.getElementById('ipt'); 2 function ajax () { 3 console.log(this.value) 4 } 5 oIpt.oninput = ajax;

      效果圖以下:

    用戶不管輸入多快,都會發出請求,從而去加載服務器資源,對性能有很大的影響.

    2.3)解決(防抖)

 1 let oIpt = document.getElementById('ipt');  2     let time = null;  3  function debounce (handle, delay) {  4         let time = null;  5         return function () {  6             let self = this,arg = arguments;  7  clearTimeout(time);  8             time = setTimeout(function () {  9  handle.apply(self,arg);  //this綁定 10  },delay) 11  } 12  } 13  function ajax (e) { 14         console.log(e,this.value) 15  } 16     oIpt.oninput = debounce(ajax, 1000)  //1s後發出請求

      效果圖:

  這種方法能夠解決屢次請求的問題,對性能有很大的提升。

  喜歡的小夥伴點個關注哦~我會再接再礪的。

相關文章
相關標籤/搜索