摘要:事件節(jié)流和防抖是為了解決開發(fā)過(guò)程中遇到性能問(wèn)題,常見(jiàn)于,頻繁點(diǎn)擊等事件節(jié)流設(shè)置一個(gè)時(shí)間間隔,時(shí)間間隔內(nèi)只允許執(zhí)行一次,好像客運(yùn)站大巴,到點(diǎn)才會(huì)走。問(wèn)題解決的原理就是事件節(jié)流隨便晃幾下執(zhí)行了多次這也就是卡頓的根源。
事件節(jié)流和防抖是為了解決開發(fā)過(guò)程中遇到性能問(wèn)題,常見(jiàn)于onscroll、onresize,頻繁點(diǎn)擊button等
事件節(jié)流設(shè)置一個(gè)時(shí)間間隔,時(shí)間間隔內(nèi)只允許執(zhí)行一次,好像客運(yùn)站大巴,到點(diǎn)才會(huì)走。
多年前遇到過(guò)一個(gè)onresize問(wèn)題,頁(yè)面滿屏布局,模塊很多dom結(jié)構(gòu)也相對(duì)復(fù)雜。所以在窗口頻繁快速變化大小的時(shí)候頁(yè)面反應(yīng)異??D。
說(shuō)實(shí)話當(dāng)初意識(shí)到是性能問(wèn)題不過(guò)不知道怎么解決,搜索了很多相關(guān)問(wèn)題,最后在https://stackoverflow.com找到...,遺憾的是具體的鏈接忘了。不過(guò)也是因?yàn)檫@個(gè)問(wèn)題宋詞愛(ài)上了這個(gè)網(wǎng)站,問(wèn)題答案很靠譜。
//問(wèn)題解決的原理就是事件節(jié)流 window.onresize = () => { console.log("resize") }
隨便晃幾下執(zhí)行了150多次,這也就是卡頓的根源。
解決這個(gè)問(wèn)題我們需要減少執(zhí)行次數(shù)。
let timer = null window.onresize = () => { console.log(timer) if (!timer) { timer = setTimeout(() => { callBack() timer = null }, 1000) } } function callBack() { console.log("resize") }
這樣不管我們一秒內(nèi)晃動(dòng)多少次callBack只執(zhí)行一次,問(wèn)題解決接下在封裝一下
//封裝前我們先思考一下,首先既然是封裝那么事件不一定都是onersize、間隔時(shí)間得有用戶設(shè)置、callBack得是用戶寫。 **其實(shí)我們只關(guān)心callBack,和執(zhí)行間隔時(shí)間,恰好事件都有回調(diào) function callBack() { console.log("resize") } function throttle(callBack, time) { let timer = null //timer狀態(tài)要常駐內(nèi)存,這里做了一個(gè)閉包 return function() { if (!timer) { timer = setTimeout(() => { callBack() timer = null }, time) } } } window.addEventListener("resize", throttle(callBack, 1000), false)
測(cè)試完美!
事件防抖常用于驗(yàn)證碼防刷,按鈕頻繁點(diǎn)擊導(dǎo)致發(fā)起多次請(qǐng)求給服務(wù)端造成壓力,代碼策略是,事件結(jié)束一段時(shí)間內(nèi)只執(zhí)行一次時(shí)間段內(nèi)再次觸發(fā)重新計(jì)時(shí),防抖原理類似 趴活的黑車,永遠(yuǎn)喊得就差一位上車就走,等你上去他接著喊就差一位上車就走。。。 擦有點(diǎn)亂 看代碼吧
//需求就是input輸入內(nèi)容停頓間隔1000ms后觸發(fā)callback
let oInput = document.querySelector("input") // oInput.addEventListener("input", function(e) { // //如果直接每次onInput發(fā)請(qǐng)求,會(huì)導(dǎo)致性能問(wèn)題 // console.log(e, this) // }) oInput.addEventListener("input", debounce(callback, 500)) function debounce(fn, delay) { let timer = null // 綁定上下文this let self = this return function() { let arg = arguments // 每次清楚定時(shí)器 clearTimeout(timer) // 重新打開定時(shí)器,做到只有最后一次執(zhí)行了 timer = setTimeout(() => { // 綁定this,傳入?yún)?shù)給callback。通常我們需要事件對(duì)象就ok fn.apply(this, arg) }, delay) } } function callback(e) { console.log("觸發(fā)", e.target.value) } function callback(e) { console.log("觸發(fā)", e.target.value) }
輸入了很多內(nèi)容 最后觸發(fā)了一次callback,效果完美!
您的吐槽or點(diǎn)贊是我的動(dòng)力!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100944.html
摘要:當(dāng)?shù)诙握{(diào)用該函數(shù)時(shí),它會(huì)清除前一次的定時(shí)器并設(shè)置另一個(gè)。然而,如果前一個(gè)定時(shí)器尚未執(zhí)行,其實(shí)就是將其替換為一個(gè)新的定時(shí)器,然后延遲一定時(shí)間再執(zhí)行。參考文章函數(shù)節(jié)流與函數(shù)防抖函數(shù)節(jié)流和函數(shù)去抖應(yīng)用場(chǎng)景辨析函數(shù)節(jié)流函數(shù)防抖實(shí)現(xiàn)原理分析 前言 事件的觸發(fā)權(quán)很多時(shí)候都屬于用戶,有些情況下會(huì)產(chǎn)生問(wèn)題: 向后臺(tái)發(fā)送數(shù)據(jù),用戶頻繁觸發(fā),對(duì)服務(wù)器造成壓力 一些瀏覽器事件:window.onresi...
摘要:當(dāng)?shù)诙握{(diào)用該函數(shù)時(shí),它會(huì)清除前一次的定時(shí)器并設(shè)置另一個(gè)。然而,如果前一個(gè)定時(shí)器尚未執(zhí)行,其實(shí)就是將其替換為一個(gè)新的定時(shí)器,然后延遲一定時(shí)間再執(zhí)行。參考文章函數(shù)節(jié)流與函數(shù)防抖函數(shù)節(jié)流和函數(shù)去抖應(yīng)用場(chǎng)景辨析函數(shù)節(jié)流函數(shù)防抖實(shí)現(xiàn)原理分析 前言 事件的觸發(fā)權(quán)很多時(shí)候都屬于用戶,有些情況下會(huì)產(chǎn)生問(wèn)題: 向后臺(tái)發(fā)送數(shù)據(jù),用戶頻繁觸發(fā),對(duì)服務(wù)器造成壓力 一些瀏覽器事件:window.onresi...
摘要:當(dāng)?shù)诙握{(diào)用該函數(shù)時(shí),它會(huì)清除前一次的定時(shí)器并設(shè)置另一個(gè)。然而,如果前一個(gè)定時(shí)器尚未執(zhí)行,其實(shí)就是將其替換為一個(gè)新的定時(shí)器,然后延遲一定時(shí)間再執(zhí)行。參考文章函數(shù)節(jié)流與函數(shù)防抖函數(shù)節(jié)流和函數(shù)去抖應(yīng)用場(chǎng)景辨析函數(shù)節(jié)流函數(shù)防抖實(shí)現(xiàn)原理分析 前言 事件的觸發(fā)權(quán)很多時(shí)候都屬于用戶,有些情況下會(huì)產(chǎn)生問(wèn)題: 向后臺(tái)發(fā)送數(shù)據(jù),用戶頻繁觸發(fā),對(duì)服務(wù)器造成壓力 一些瀏覽器事件:window.onresi...
摘要:節(jié)流在指定時(shí)間之內(nèi),讓函數(shù)只觸發(fā)一次。防抖對(duì)于一定時(shí)間段的連續(xù)的函數(shù)調(diào)用,只讓其執(zhí)行一次??偨Y(jié)以上只是很簡(jiǎn)單的寫了一下節(jié)流和防抖的原理,在里,實(shí)現(xiàn)起來(lái)更加復(fù)雜,但是背后的原理核心就是上邊代碼寫的。 概述 在平時(shí)的開發(fā)中,經(jīng)常會(huì)聽(tīng)到兩個(gè)差不多很相近的詞。節(jié)流(throttle)和防抖(debounce)。這是兩個(gè)類似又有些不同的優(yōu)化方案。 節(jié)流:在指定時(shí)間之內(nèi),讓函數(shù)只觸發(fā)一次。 防...
閱讀 1083·2021-09-29 09:35
閱讀 4664·2021-09-22 15:24
閱讀 1460·2021-07-25 21:37
閱讀 2191·2019-08-30 14:17
閱讀 975·2019-08-30 13:56
閱讀 2420·2019-08-29 17:07
閱讀 1279·2019-08-29 12:44
閱讀 2713·2019-08-26 18:26