老生常談Javascript的防抖和節(jié)流
1. 什么是防抖
【解釋】: 防抖策略(debounce)是當(dāng)事件被觸發(fā)后,延遲 n 秒后再執(zhí)行回調(diào),如果在這 n 秒內(nèi)事件又被觸發(fā),則重新計(jì)時(shí)。
【圖解】:

【作用】:
當(dāng)用戶頻繁觸發(fā)該事件的時(shí)候,確保只進(jìn)行最后一次的請(qǐng)求操作,節(jié)約請(qǐng)求的資源
【實(shí)現(xiàn)輸入框的防抖】:
var timer = null // 1. 防抖動(dòng)的 timer
function debounceSearch(keywords) { // 2. 定義防抖的函數(shù)
timer = setTimeout(function() {
// 發(fā)起 JSONP 請(qǐng)求
getSuggestList(keywords)
}, 500)
}
$('#ipt').on('keyup', function() { // 3. 在觸發(fā) keyup 事件時(shí),立即清空 timer
clearTimeout(timer)
// ...省略其他代碼
debounceSearch(keywords)
})
【實(shí)現(xiàn)建議框緩存】:
定義全局緩存對(duì)象
// 緩存對(duì)象
var cacheObj = {}
將搜索結(jié)果保存到緩存對(duì)象中
// 渲染建議列表
function renderSuggestList(res) {
// ...省略其他代碼
// 將搜索的結(jié)果,添加到緩存對(duì)象中
var k = $('#ipt').val().trim()
cacheObj[k] = res
}
優(yōu)先從緩存中獲取搜索建議
// 監(jiān)聽文本框的 keyup 事件
$('#ipt').on('keyup', function() {
// ...省略其他代碼
// 優(yōu)先從緩存中獲取搜索建議
if (cacheObj[keywords]) {
return renderSuggestList(cacheObj[keywords])
}
// 獲取搜索建議列表
debounceSearch(keywords)
})
2、什么是節(jié)流
【解釋】: 減少一段時(shí)間內(nèi)事件的觸發(fā)頻率。也叫節(jié)流策略。
【圖解】:

【應(yīng)用】
- 鼠標(biāo)連續(xù)不斷地觸發(fā)某事件(如點(diǎn)擊),只在單位時(shí)間內(nèi)只觸發(fā)一次;
- 懶加載時(shí)要監(jiān)聽計(jì)算滾動(dòng)條的位置,但不必每次滑動(dòng)都觸發(fā),可以降低計(jì)算的頻率,而不必去浪費(fèi) CPU 資源;
【鼠標(biāo)跟隨案例】:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./lib/jquery.js"></script>
<style>
html,
body {
margin: 0;
padding: 0;
overflow: hidden;
}
#angel {
position: absolute;
}
</style>
</head>
<body>
<img src="./angel.gif" alt="" id="angel" />
<script>
$(function () {
// 獲取圖片元素
var angel = $('#angel')
// 綁定鼠標(biāo)移動(dòng)事件
$(document).on('mousemove', function (e) {
// 獲取鼠標(biāo)到x和y軸的距離設(shè)置給圖片的高和左
$(angel).css('top', e.pageY-40 + 'px').css('left', e.pageX-40 + 'px')
})
})
</script>
</body>
</html>
3、節(jié)流閥
【解釋】:
- 節(jié)流閥為空,表示可以執(zhí)行下次操作;不為空,表示不能執(zhí)行下次操作。
- 當(dāng)前操作執(zhí)行完,必須將節(jié)流閥重置為空,表示可以執(zhí)行下次操作了。
- 每次執(zhí)行操作前,必須先判斷節(jié)流閥是否為空。
【使用節(jié)流優(yōu)化】:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="./lib/jquery.js"></script>
<style>
html,
body {
margin: 0;
padding: 0;
overflow: hidden;
}
#angel {
position: absolute;
}
</style>
</head>
<body>
<img src="./angel.gif" alt="" id="angel" />
<script>
$(function () {
// 定義一個(gè)節(jié)流閥
var timer = null;
// 獲取圖片元素
var angel = $('#angel')
// 綁定鼠標(biāo)移動(dòng)事件
$(document).on('mousemove', function (e) {
// 判斷節(jié)流閥是否為空
if (timer) return
// 控制節(jié)流閥的時(shí)間
timer = setTimeout(function () {
// 獲取鼠標(biāo)到x和y軸的距離設(shè)置給圖片的高和左
$(angel).css('top', e.pageY - 40 + 'px').css('left', e.pageX - 40 + 'px')
// 清空節(jié)流閥
timer = null
}, 100)
})
})
</script>
</body>
</html>
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
在Javascript中處理數(shù)組之toSource()方法的使用
這篇文章主要介紹了在Javascript中處理數(shù)組之toSource()方法的使用,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06
JavaScript表達(dá)式:URL 協(xié)議介紹
javascript:后面可以是表達(dá)式或者使用分號(hào)分隔的表達(dá)式集合如javascript: 5 + 4,感興趣的朋友可以參考下或許可以幫助到你2013-03-03
js中 關(guān)于undefined和null的區(qū)別介紹
本篇文章小編將為大家介紹,js中 關(guān)于undefined和null的區(qū)別,有需要的朋友可以參考一下2013-04-04
JavaScript 學(xué)習(xí)筆記之基礎(chǔ)中的基礎(chǔ)
這篇文章主要介紹了JavaScript 學(xué)習(xí)筆記系列的第一篇文章,跟所有開篇一樣,本文我們介紹的都是些基礎(chǔ)中的基礎(chǔ)知識(shí),雖然都是基礎(chǔ),但建議大家不要略過此文2015-01-01

