摘要:函數(shù)防抖概念在事件被觸發(fā)秒后再執(zhí)行回調(diào),如果在這秒內(nèi)又被觸發(fā),則重新計(jì)時(shí)。應(yīng)用場(chǎng)景給按鈕加函數(shù)防抖防止表單多次提交。對(duì)于輸入框連續(xù)輸入進(jìn)行驗(yàn)證時(shí),用函數(shù)防抖能有效減少請(qǐng)求次數(shù)。
函數(shù)防抖(debounce)
::概念:: 在事件被觸發(fā)n秒后再執(zhí)行回調(diào),如果在這n秒內(nèi)又被觸發(fā),則重新計(jì)時(shí)。
::實(shí)例:: 如果有人進(jìn)電梯(觸發(fā)事件),那電梯將在10秒鐘后出發(fā)(執(zhí)行事件監(jiān)聽(tīng)器),這時(shí)如果又有人進(jìn)電梯了(在10秒內(nèi)再次觸發(fā)該事件),我們又得等10秒再出發(fā)(重新計(jì)時(shí))。
應(yīng)用場(chǎng)景* 給按鈕加函數(shù)防抖防止表單多次提交。 * 對(duì)于輸入框連續(xù)輸入進(jìn)行AJAX驗(yàn)證時(shí),用函數(shù)防抖能有效減少請(qǐng)求次數(shù)。 * 判斷scroll是否滑到底部,滾動(dòng)事件+函數(shù)防抖 > 總的來(lái)說(shuō),適合多次事件一次響應(yīng)的情況函數(shù)代碼
function debounce(fn, wait) { let timer = null; return function () { const context = this const args = arguments if (timer) { clearTimeout(timer); timer = null; } timer = setTimeout(function () { fn.apply(context, args) }, wait) } } var fn = function () { console.log("boom") } // 滾動(dòng)停止時(shí)候執(zhí)行 window.onscroll = debounce(fn, 500)函數(shù)節(jié)流(throttle)
::概念:: 規(guī)定一個(gè)單位時(shí)間,在這個(gè)單位時(shí)間內(nèi),只能有一次觸發(fā)事件的回調(diào)函數(shù)執(zhí)行,如果在同一個(gè)單位時(shí)間內(nèi)某事件被觸發(fā)多次,只有一次能生效。
::實(shí)例:: 我們知道目前的一種說(shuō)法是當(dāng) 1 秒內(nèi)連續(xù)播放 24 張以上的圖片時(shí),在人眼的視覺(jué)中就會(huì)形成一個(gè)連貫的動(dòng)畫(huà),所以在電影的播放(以前是,現(xiàn)在不知道)中基本是以每秒 24 張的速度播放的,為什么不 100 張或更多是因?yàn)?24 張就可以滿足人類視覺(jué)需求的時(shí)候,100 張就會(huì)顯得很浪費(fèi)資源。
應(yīng)用場(chǎng)景* 游戲中的刷新率 * DOM元素拖拽 * Canvas畫(huà)筆功能 * DOM 元素的拖拽功能實(shí)現(xiàn)(mousemove) * 射擊游戲的 mousedown/keydown 事件(單位時(shí)間只能發(fā)射一顆子彈) * 計(jì)算鼠標(biāo)移動(dòng)的距離(mousemove) * Canvas 模擬畫(huà)板功能(mousemove) * 搜索聯(lián)想(keyup) * 監(jiān)聽(tīng)滾動(dòng)事件判斷是否到頁(yè)面底部自動(dòng)加載更多:給 scroll 加了 debounce 后,只有用戶停止?jié)L動(dòng)后,才會(huì)判斷是否到了頁(yè)面底部;如果是 throttle 的話,只要頁(yè)面滾動(dòng)就會(huì)間隔一段時(shí)間判斷一次 > 總的來(lái)說(shuō),適合大量事件按時(shí)間做平均分配觸發(fā)。函數(shù)代碼
function throttle(fn, gapTime) { // 定義上次時(shí)間為null let _lastTime = null return function() { // 獲取當(dāng)前時(shí)間 let _nowTime = +new Date() // 如果當(dāng)前時(shí)間-上次時(shí)間>間隔時(shí)間 或 上次時(shí)間不存在 if (_nowTime - _lastTime > gapTime || !_lastTime) { // 執(zhí)行函數(shù) fn() // 重置上次時(shí)間為當(dāng)前時(shí)間 _lastTime = _nowTime } } } let fn = () => { console.log("boom") } window.onscroll = throttle(fn, 1000)使用 debounce 和 throttle 以及常見(jiàn)的坑
不止一次地調(diào)用 debounce 方法:
// 錯(cuò)誤 $(window).on("scroll", function() { debounce(doSomething, 300) }) // 正確 $(window).on("scroll", debounce(doSomething, 200))
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/93601.html
摘要:若時(shí)間差大于間隔時(shí)間,則立刻執(zhí)行一次函數(shù)。不同點(diǎn)函數(shù)防抖,在一段連續(xù)操作結(jié)束后,處理回調(diào),利用和實(shí)現(xiàn)。函數(shù)防抖關(guān)注一定時(shí)間連續(xù)觸發(fā)的事件只在最后執(zhí)行一次,而函數(shù)節(jié)流側(cè)重于一段時(shí)間內(nèi)只執(zhí)行一次。 原博客地址,歡迎star 函數(shù)防抖和節(jié)流 函數(shù)防抖和函數(shù)節(jié)流:優(yōu)化高頻率執(zhí)行js代碼的一種手段,js中的一些事件如瀏覽器的resize、scroll,鼠標(biāo)的mousemove、mouseover...
摘要:而上述兩種方法,就叫做函數(shù)的節(jié)流和防抖。二函數(shù)節(jié)流和函數(shù)防抖函數(shù)節(jié)流函數(shù)節(jié)流函數(shù)節(jié)流是讓這個(gè)函數(shù)在間隔某一段時(shí)間執(zhí)行一次。在這個(gè)項(xiàng)目中,我認(rèn)為函數(shù)節(jié)流和函數(shù)防抖都能很好的解決問(wèn)題。 一 項(xiàng)目需求 最近在做一些小的練手代碼的時(shí)候,碰到了一個(gè)很常見(jiàn)的問(wèn)題,當(dāng)在搜索框中進(jìn)行搜索的時(shí)候,如果快速輸入很多字符的話,搜索框的監(jiān)聽(tīng)回調(diào)函數(shù)會(huì)執(zhí)行很多次,如果回調(diào)業(yè)務(wù)較復(fù)雜的話,可能會(huì)導(dǎo)致頁(yè)面運(yùn)行緩慢甚...
摘要:隆重請(qǐng)出主角防抖與節(jié)流。防抖與節(jié)流的異同相同都是防止某一時(shí)間段內(nèi),函數(shù)被頻繁調(diào)用執(zhí)行,通過(guò)時(shí)間頻率控制,減少回調(diào)函數(shù)執(zhí)行次數(shù),來(lái)實(shí)現(xiàn)相關(guān)性能優(yōu)化。參考文章分鐘理解的節(jié)流防抖及使用場(chǎng)景函數(shù)防抖和節(jié)流 showImg(https://segmentfault.com/img/bVburM8?w=800&h=600); 本篇課題,或許早已是爛大街的解讀文章。不過(guò)春招系列面試下來(lái),不少伙伴們還...
摘要:文件為函數(shù)要傳入的參數(shù)返回事件處理函數(shù)添加事件監(jiān)聽(tīng)節(jié)流函數(shù)一般用于事件的情況較多,因?yàn)檫@些事件的觸發(fā)是連續(xù)性的,需要在一個(gè)時(shí)間間隔內(nèi)只觸發(fā)一次。 showImg(https://segmentfault.com/img/remote/1460000018998747); 閱讀原文 前言 在前端開(kāi)發(fā)當(dāng)中我們經(jīng)常會(huì)綁定一些事件觸發(fā)的某些程序執(zhí)行,有時(shí)這些事件會(huì)連續(xù)觸發(fā),如瀏覽器窗口 s...
摘要:本文會(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)象。 本文由小芭樂(lè)發(fā)表 0. 引入 首先舉一個(gè)例子: 模擬在輸入框輸入后做ajax查詢請(qǐng)求,沒(méi)有加入防抖和節(jié)流的效果,這里附上完整可執(zhí)行代碼: 沒(méi)有防抖 ...
摘要:此時(shí)需要采用防抖和節(jié)流的方式來(lái)減少調(diào)用頻率,同時(shí)不影響原來(lái)效果。函數(shù)防抖當(dāng)持續(xù)觸發(fā)事件時(shí),一段時(shí)間段內(nèi)沒(méi)有再觸發(fā)事件,事件處理函數(shù)才會(huì)執(zhí)行一次,如果設(shè)定的時(shí)間到來(lái)之前就觸發(fā)了事件,延時(shí)重新開(kāi)始。 js 防抖 節(jié)流 JavaScript 實(shí)際工作中,通過(guò)監(jiān)聽(tīng)某些事件,如scroll事件檢測(cè)滾動(dòng)位置,根據(jù)滾動(dòng)位置顯示返回頂部按鈕;如resize事件,對(duì)某些自適應(yīng)頁(yè)面調(diào)整DOM的渲染;如ke...
閱讀 3000·2023-04-25 21:23
閱讀 3044·2021-09-22 15:24
閱讀 871·2019-08-30 12:55
閱讀 2105·2019-08-29 18:42
閱讀 2615·2019-08-29 16:27
閱讀 955·2019-08-26 17:40
閱讀 2189·2019-08-26 13:29
閱讀 2614·2019-08-26 11:45