摘要:節(jié)流的實現(xiàn)方式有兩種主流的實現(xiàn)方式,一種是時間戳,一種是設(shè)置定時器。使用定時器有個問題就是點擊不會立即執(zhí)行,需要延遲設(shè)定的時間才會執(zhí)行。
前言
在活動需求中,因為做的狂點小游戲。在實際體驗中就會出現(xiàn),頻繁的點擊造成動畫的不連貫,影響用戶體驗。并且再播放音效的時候,如果沒點擊一次就觸發(fā)一次音效會造成將聲音壓入到棧中,會持續(xù)的播放。因此在這里的操作做了節(jié)流的限制,隔多少秒觸發(fā)一次。總結(jié)一下節(jié)流的實現(xiàn)方法。
節(jié)流節(jié)流的原理很簡單:如果你持續(xù)觸發(fā)事件,每隔一段時間,只執(zhí)行一次事件。
根據(jù)首次是否執(zhí)行以及結(jié)束后是否執(zhí)行,效果有所不同,實現(xiàn)的方式也有所不同。
節(jié)流的實現(xiàn)方式有兩種主流的實現(xiàn)方式,一種是時間戳,一種是設(shè)置定時器。
本次活動利用的就是該實現(xiàn)方式。
使用時間戳,當(dāng)觸發(fā)事件的時候,我們?nèi)〕霎?dāng)前的時間戳,然后減去之前的時間戳(最一開始值設(shè)為0),如果大于設(shè)置的時間周期,就執(zhí)行函數(shù),然后更新時間戳為當(dāng)前的時間戳,如果小于就不執(zhí)行。
具體代碼如下:
function throttle(fun, wait) { var context,args; var previous = 0; return function () { var now = +new Date();//格式化時間 context = this; args = arguments; if(now - previous > wait){ fun.apply(context,args); previous = now; } } }
如果在事件的回調(diào)中執(zhí)行,就要具體修改一下。這樣寫法適用于,將要執(zhí)行的函數(shù)直接賦值給事件。btn.addEventListener("click",throttle(addSelf,2000),false);因為throttle返回的是一個函數(shù),直接賦值給事件可以觸發(fā)執(zhí)行。
var previous = 0; function throttle(fun, wait) { var context,args; return function () { var now = +new Date();//格式化時間 context = this; args = arguments; if(now - previous > wait){ fun.apply(context,args); previous = now; } } }
將previous提升到外面,寫法就改為btn.addEventListener("click",function () {
throttle(addSelf,2000)(); },false); 這時throttle函數(shù)在后面要加小括號直接執(zhí)行。使用定時器
當(dāng)觸發(fā)事件的時候,我們設(shè)置一個定時器,再觸發(fā)事件的時候,如果定時器存在,就不執(zhí)行,直到定時器執(zhí)行,然后執(zhí)行函數(shù),清空定時器,這樣就可以設(shè)置下個定時器。
function throttle(fun, wait) { var timeout context,args; return function () { context = this; args = arguments; if(!timeout){ timeout = setTimeout(function () { timeout = null; fun.apply(context,args) },wait) } } }
比較同理如果用在回調(diào)函數(shù)中,需要將timeout提到函數(shù)外面。
使用定時器有個問題就是點擊不會立即執(zhí)行,需要延遲設(shè)定的時間才會執(zhí)行。
1.第一種事件會立即執(zhí)行,第二種事件會在n秒后第一次執(zhí)行
2.第一種事件停止觸發(fā)后沒有辦法再執(zhí)行事件,第二種事件停止觸發(fā)后依然會再執(zhí)行一次事件
結(jié)合這兩種方法,并且可以配置是否要第一次立即執(zhí)行或者停止觸發(fā)后再執(zhí)行一次。直接上代碼
配置第三個參數(shù)leading:false表明不需要第一次立即執(zhí)行。trailing:false表明停止觸發(fā)后不再執(zhí)行最后一次。
var previous = 0; var timeout; function throttle(fun, wait, options) { var context,args; /*var previous = 0;*/ if(!options) options = {}; var later = function () { previous = options.leading === false ? 0 :new Date().getTime(); timeout = null; fun.apply(context,args); if(!timeout) context = args = null; }; var throttled = function () { var now = new Date().getTime(); if(!previous && options.leading === false) previous = now; var remaining = wait - (now - previous); context = this; args = arguments; if(remaining <= 0 || remaining > wait) { if(timeout){ clearTimeout(timeout); timeout = null; } previous = now; fun.apply(context,args); if(!timeout) context = args = null; } else if(!timeout && options.trailing !==false){ timeout = setTimeout(later,remaining) } }; return throttled; } //使用 btn.addEventListener("click",function () { throttle(addSelf,2000,{trailing:false})(); },false);
注意默認(rèn)情況下都是兼顧了第一次點擊立即觸發(fā)和最后觸發(fā)后執(zhí)行一次。
leading:false和trailing:false不能同時設(shè)置。
如果同時設(shè)置的話,比如當(dāng)你在不再點擊的時候,因為trailing設(shè)為了false,停止觸發(fā)不會設(shè)置定時器,所以只要再過了設(shè)置的時間,在點擊的話,就會立即執(zhí)行,就違反了leading:false了。所以該方法只有三種情況可用。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/90045.html
摘要:函數(shù)節(jié)流的原理函數(shù)節(jié)流的原理挺簡單的,估計大家都想到了,那就是定時器。在高級程序設(shè)計一書有介紹函數(shù)節(jié)流,里面封裝了這樣一個函數(shù)節(jié)流函數(shù),它把定時器存為函數(shù)的一個屬性個人的世界觀不喜歡這種寫法。 什么是函數(shù)節(jié)流? 介紹前,先說下背景。在前端開發(fā)中,有時會為頁面綁定resize事件,或者為一個頁面元素綁定拖拽事件(其核心就是綁定mousemove),這種事件有一個特點,就是用戶不必特地?fù)v亂...
摘要:為了解決這些問題,就可以使用定時器對函數(shù)進(jìn)行節(jié)流。第一次調(diào)用函數(shù),創(chuàng)建一個定時器,在指定的時間間隔之后運行代碼。當(dāng)?shù)诙握{(diào)用該函數(shù)時,它會清除前一次的定時器并設(shè)置另一個。 函數(shù)節(jié)流的目的 從字面上就可以理解,函數(shù)節(jié)流就是用來節(jié)流函數(shù)從而一定程度上優(yōu)化性能的。例如,DOM 操作比起非DOM 交互需要更多的內(nèi)存和CPU 時間。連續(xù)嘗試進(jìn)行過多的DOM 相關(guān)操作可能會導(dǎo)致瀏覽器掛起,有時候甚...
摘要:目的都是為了降低回調(diào)函數(shù)執(zhí)行頻率,節(jié)省計算機資源,優(yōu)化性能,提升用戶體驗。函數(shù)防抖事件頻繁觸發(fā)的情況下,只有經(jīng)過足夠的空閑時間,才執(zhí)行代碼一次。 函數(shù)節(jié)流和函數(shù)防抖的對比分析 一、前言 前端開發(fā)中,函數(shù)節(jié)流(throttle) 和 函數(shù)防抖(debounce) 作為常用的性能優(yōu)化方法,兩者都是用于優(yōu)化高頻率執(zhí)行 js 代碼的手段,那具體它們有什么異同點呢?有對這兩個概念不太了解的小伙伴...
摘要:此時需要采用防抖和節(jié)流的方式來減少調(diào)用頻率,同時不影響原來效果。函數(shù)防抖當(dāng)持續(xù)觸發(fā)事件時,一段時間段內(nèi)沒有再觸發(fā)事件,事件處理函數(shù)才會執(zhí)行一次,如果設(shè)定的時間到來之前就觸發(fā)了事件,延時重新開始。 js 防抖 節(jié)流 JavaScript 實際工作中,通過監(jiān)聽某些事件,如scroll事件檢測滾動位置,根據(jù)滾動位置顯示返回頂部按鈕;如resize事件,對某些自適應(yīng)頁面調(diào)整DOM的渲染;如ke...
摘要:本文會分別介紹什么是防抖和節(jié)流,它們的應(yīng)用場景,和實現(xiàn)方式。防抖和節(jié)流都是為了解決短時間內(nèi)大量觸發(fā)某函數(shù)而導(dǎo)致的性能問題,比如觸發(fā)頻率過高導(dǎo)致的響應(yīng)速度跟不上觸發(fā)頻率,出現(xiàn)延遲,假死或卡頓的現(xiàn)象。 本文由小芭樂發(fā)表 0. 引入 首先舉一個例子: 模擬在輸入框輸入后做ajax查詢請求,沒有加入防抖和節(jié)流的效果,這里附上完整可執(zhí)行代碼: 沒有防抖 ...
摘要:主要實現(xiàn)思路就是通過定時器,通過設(shè)置延時時間,在第一次調(diào)用時,創(chuàng)建定時器,寫入需要執(zhí)行的函數(shù)。如果這時前一個定時器暫未執(zhí)行,則將其替換為新的定時器。 JS中的函數(shù)節(jié)流 一、什么是函數(shù)節(jié)流(throttle) 概念:限制一個函數(shù)在一定時間內(nèi)只能執(zhí)行一次。 舉個栗子,坐火車或地鐵,過安檢的時候,在一定時間(例如10秒)內(nèi),只允許一個乘客通過安檢入口,以配合安檢人員完成安檢工作。上例中,每1...
閱讀 3428·2021-11-19 09:40
閱讀 1313·2021-10-11 11:07
閱讀 4844·2021-09-22 15:07
閱讀 2890·2021-09-02 15:15
閱讀 1964·2019-08-30 15:55
閱讀 539·2019-08-30 15:43
閱讀 883·2019-08-30 11:13
閱讀 1449·2019-08-29 15:36