js函數(shù)節(jié)流

在實(shí)際應(yīng)用中,因頻繁執(zhí)行DOM操作、資源加載等重行為严肪,導(dǎo)致UI停頓甚至瀏覽器崩潰。比如:

  • window對象的resize谦屑、scroll事件
  • 拖拽時(shí)的mousemove事件
  • 射擊游戲中的mousedown驳糯、keydown事件
  • 文字輸入、自動(dòng)完成的keyup事件

一個(gè)簡單的scroll操作:

window.onscroll =  function(){
    lazyload();
 };
function lazyload(){
    console.log("scroll執(zhí)行了");
}
image.png

因此我們需要借助函數(shù)節(jié)流來解決氢橙。

debounce

抖動(dòng):如果用手指一直按住一個(gè)彈簧酝枢,它將不會(huì)彈起直到你松手為止。 也就是說當(dāng)調(diào)用動(dòng)作n毫秒后悍手,才會(huì)執(zhí)行該動(dòng)作帘睦,若在這n毫秒內(nèi)又調(diào)用此動(dòng)作則將重新計(jì)算執(zhí)行時(shí)間。這種比較適合window的resize事件坦康,實(shí)際需求大多為停止改變大小n毫秒后執(zhí)行后續(xù)處理竣付;而其他事件大多的需求是以一定的頻率執(zhí)行后續(xù)處理。針對這兩種需求就出現(xiàn)了和throttle兩種解決辦法涝焙。

方法1:

window.onscroll =  function(){
 //lazyload();
 debounce(lazyload,window);
};
function debounce(method,context){
    clearTimeout(method.timeout);
    method.timeout = setTimeout(function(){
          method.call(context);
    },500);
 } 
 function lazyload(){
 console.log("scroll執(zhí)行了"+scrollnum);
  }

效果:

image.png

利用定時(shí)器卑笨,讓函數(shù)執(zhí)行延遲500毫秒,在500毫秒內(nèi)如果有函數(shù)又被調(diào)用則刪除上一次調(diào)用仑撞,這次調(diào)用500毫秒后執(zhí)行赤兴,如此往復(fù)。

方法2:
還有一種節(jié)流方式隧哮,是通過返回閉包的形式桶良,可以設(shè)置延遲時(shí)間,兩者運(yùn)行的結(jié)果是一樣沮翔,但是我在實(shí)際操作的時(shí)候設(shè)置延遲500時(shí)陨帆,滾動(dòng)過了一會(huì)才執(zhí)行了,設(shè)置為delay為100的時(shí)候在視覺上就沒有感覺延遲。而且函數(shù)也只滾動(dòng)了一次。

function debounce1(method,delay){
   var timer = null;
   return function(){
     var context = this,args = arguments;
     clearTimeout(timer);
     timer = setTimeout(function(){
         method.apply(context,args);
     },delay);
   }
 }

throttle

當(dāng)我一直滾動(dòng)鼠標(biāo)的時(shí)候疲牵,lazyload函數(shù)就會(huì)不斷被延遲承二,這樣只有停下來的時(shí)候才會(huì)執(zhí)行,那么再有些需要及時(shí)顯示的情況下纲爸,就顯得不那么友好了(對于實(shí)現(xiàn)keyup事件的提示也沒有意義了)亥鸠,所以可以為函數(shù)添加一個(gè)參數(shù)作為到固定間隔必須執(zhí)行,到了這個(gè)時(shí)間間隔就必須執(zhí)行识啦,這個(gè)時(shí)候就引入了節(jié)流:
節(jié)流:如果將水龍頭擰緊直到水是以水滴的形式流出负蚊,那你會(huì)發(fā)現(xiàn)每隔一段時(shí)間,就會(huì)有一滴水流出颓哮。也就是會(huì)說預(yù)先設(shè)定一個(gè)執(zhí)行周期家妆,當(dāng)調(diào)用動(dòng)作的時(shí)刻大于等于執(zhí)行周期則執(zhí)行該動(dòng)作,然后進(jìn)入下一個(gè)新周期
代碼如下:

function throttle2(method, delay, time) {
     var timeout,startTime = new Date();
     return function() {
         var context = this,
         args = arguments,
         curTime = new Date();
         clearTimeout(timeout);
         // 如果達(dá)到了規(guī)定的觸發(fā)時(shí)間間隔冕茅,觸發(fā) handler
         if (curTime - startTime >= time) {
           method.apply(context, args);
           startTime = curTime;
         // 沒達(dá)到觸發(fā)間隔伤极,重新設(shè)定定時(shí)器
       } else {
           timeout = setTimeout(method, delay);
     }
 };
image.png

在這個(gè)函數(shù)中,當(dāng)一次時(shí)間較長的時(shí)候還是會(huì)執(zhí)行兩次嵌赠,而不是等滾動(dòng)停止之后再執(zhí)行塑荒。達(dá)到了想要的效果,既沒有頻繁的執(zhí)行也沒有最后執(zhí)行姜挺。

來源:關(guān)于js函數(shù)節(jié)流和去抖動(dòng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末齿税,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子炊豪,更是在濱河造成了極大的恐慌凌箕,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件词渤,死亡現(xiàn)場離奇詭異牵舱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缺虐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門芜壁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人高氮,你說我怎么就攤上這事慧妄。” “怎么了剪芍?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵塞淹,是天一觀的道長。 經(jīng)常有香客問我罪裹,道長饱普,這世上最難降的妖魔是什么运挫? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮套耕,結(jié)果婚禮上谁帕,老公的妹妹穿的比我還像新娘。我一直安慰自己冯袍,他們只是感情好雇卷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著颠猴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪小染。 梳的紋絲不亂的頭發(fā)上翘瓮,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音裤翩,去河邊找鬼资盅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛踊赠,可吹牛的內(nèi)容都是我干的呵扛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼筐带,長吁一口氣:“原來是場噩夢啊……” “哼今穿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伦籍,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蓝晒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后帖鸦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年杆故,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舱沧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡攻锰,死狀恐怖晾嘶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情口注,我是刑警寧澤变擒,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站寝志,受9級特大地震影響娇斑,放射性物質(zhì)發(fā)生泄漏策添。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一毫缆、第九天 我趴在偏房一處隱蔽的房頂上張望唯竹。 院中可真熱鬧,春花似錦苦丁、人聲如沸浸颓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽产上。三九已至,卻和暖如春蛾狗,著一層夾襖步出監(jiān)牢的瞬間晋涣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工沉桌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谢鹊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓留凭,卻偏偏與公主長得像佃扼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蔼夜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 實(shí)際上啊兼耀,今天早上本來想干點(diǎn)別的,但是在吃早餐的時(shí)候?yàn)g覽了下掘金挎扰,然后看到了這篇博文 Jake的關(guān)于圖片懶加載 ...
    6J閱讀 9,887評論 1 23
  • 在前端開發(fā)中有一部分的用戶行為會(huì)頻繁的觸發(fā)事件執(zhí)行翠订,而對于DOM操作、資源加載等耗費(fèi)性能的處理遵倦,很可能導(dǎo)致界面卡頓...
    bestvist閱讀 524評論 0 5
  • 某些情況下尽超,例如響應(yīng)鼠標(biāo)移動(dòng)、窗口大小調(diào)整梧躺、頁面滾動(dòng)的事件似谁,觸發(fā)的頻率較高。如果這個(gè)時(shí)候需要處理的函數(shù)稍微復(fù)雜點(diǎn)掠哥,...
    Tiny_z閱讀 1,246評論 0 0
  • 昨天加班巩踏,下午三點(diǎn)多鐘一幫同事就按耐不住寂寞了,原因:本來好好的周末應(yīng)該好好嗨的续搀,卻被單位一個(gè)個(gè)拖過去加班塞琼,當(dāng)然心...
    juliareal閱讀 1,267評論 0 0
  • 最近換了份工作,連同住所一起搬了禁舷。搬家的那天下雨彪杉,本來有個(gè)男生答應(yīng)幫我一起搬毅往,臨時(shí)有事來不了,我聯(lián)系了搬家公司派近,但...
    意語軒閱讀 544評論 9 8