成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

js 防抖 節(jié)流 JavaScript

int64 / 463人閱讀

摘要:此時需要采用防抖和節(jié)流的方式來減少調(diào)用頻率,同時不影響原來效果。函數(shù)防抖當(dāng)持續(xù)觸發(fā)事件時,一段時間段內(nèi)沒有再觸發(fā)事件,事件處理函數(shù)才會執(zhí)行一次,如果設(shè)定的時間到來之前就觸發(fā)了事件,延時重新開始。

js 防抖 節(jié)流 JavaScript

實(shí)際工作中,通過監(jiān)聽某些事件,如scroll事件檢測滾動位置,根據(jù)滾動位置顯示返回頂部按鈕;如resize事件,對某些自適應(yīng)頁面調(diào)整DOM的渲染;如keyup事件,監(jiān)聽文字輸入并調(diào)用接口進(jìn)行模糊匹配等等,這些事件處理函數(shù)調(diào)用的頻率如果太高,會加重瀏覽器的負(fù)擔(dān),減弱性能,造成用戶體驗(yàn)不好。此時需要采用debounce(防抖)和throttle(節(jié)流)的方式來減少調(diào)用頻率,同時不影響原來效果。

函數(shù)防抖(debounce)

當(dāng)持續(xù)觸發(fā)事件時,一段時間段內(nèi)沒有再觸發(fā)事件,事件處理函數(shù)才會執(zhí)行一次,如果設(shè)定的時間到來之前就觸發(fā)了事件,延時重新開始。
函數(shù)防抖的應(yīng)用場景,最常見的就是用戶注冊時候的手機(jī)號碼驗(yàn)證和郵箱驗(yàn)證了。只有等用戶輸入完畢后,前端才需要檢查格式是否正確,如果不正確,再彈出提示語。

上圖中,持續(xù)觸發(fā)scroll事件時,并不執(zhí)行handle函數(shù),當(dāng)1000毫秒內(nèi)沒有觸發(fā)scroll事件時,才會延時觸發(fā)scroll事件;
上面原理:對處理函數(shù)進(jìn)行延時操作,若設(shè)定的延時到來之前,再次觸發(fā)事件,則清除上一次的延時操作定時器,重新定時。
代碼如下:

// 函數(shù)防抖
var timer = false;
document.getElementById("debounce").onscroll = function(){
    clearTimeout(timer); // 清除未執(zhí)行的代碼,重置回初始化狀態(tài)

    timer = setTimeout(function(){
        console.log("函數(shù)防抖");
    }, 1000);
};

防抖函數(shù)的封裝使用

/**
 * 防抖函數(shù)
 * @param method 事件觸發(fā)的操作
 * @param delay 多少毫秒內(nèi)連續(xù)觸發(fā)事件,不會執(zhí)行
 * @returns {Function}
 */
function debounce(method,delay) {
    let timer = null;
    return function () {
        let self = this,
            args = arguments;
        timer && clearTimeout(timer);
        timer = setTimeout(function () {
            method.apply(self,args);
        },delay);
    }
}
window.onscroll = debounce(function () {
    let scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
    console.log("滾動條位置:" + scrollTop);
},1000)

另一種寫法

// 防抖
function debounce(fn, wait) {    
    var timeout = null;    
    return function() {        
        if(timeout !== null)   clearTimeout(timeout);        
        timeout = setTimeout(fn, wait);    
    }
}
// 處理函數(shù)
function handle() {    
    console.log("函數(shù)防抖"); 
}
// 滾動事件
window.addEventListener("scroll", debounce(handle, 1000));
函數(shù)節(jié)流(throttlo)

當(dāng)持續(xù)觸發(fā)事件時,保證一定時間段內(nèi)只調(diào)用一次事件處理函數(shù)。
函數(shù)節(jié)流應(yīng)用的實(shí)際場景,多數(shù)在監(jiān)聽頁面元素滾動事件的時候會用到。

上圖中,持續(xù)觸發(fā)scroll事件時,并不立即執(zhí)行handle函數(shù),每隔1000毫秒才會執(zhí)行一次handle函數(shù);
函數(shù)節(jié)流的要點(diǎn)是,聲明一個變量當(dāng)標(biāo)志位,記錄當(dāng)前代碼是否在執(zhí)行。如果空閑,則可以正常觸發(fā)方法執(zhí)行。
代碼如下:

// 函數(shù)節(jié)流 定時器
var canRun = true;
document.getElementById("throttle").onscroll = function(){
    if(!canRun){
        // 判斷是否已空閑,如果在執(zhí)行中,則直接return
        return;
    }

    canRun = false;
    setTimeout(function(){
        console.log("函數(shù)節(jié)流");
        canRun = true;
    }, 300);
};

節(jié)流函數(shù)的封裝使用

//節(jié)流throttle代碼(時間戳)
var throttle = function(func, delay) {            
  var prev = Date.now();            
  return function() {                
    var context = this;                
    var args = arguments;                
    var now = Date.now();                
    if (now - prev >= delay) {                    
      func.apply(context, args);                    
      prev = Date.now();                
    }            
  }        
}        
function handle() {            
  console.log("函數(shù)節(jié)流");        
}        
window.addEventListener("scroll", throttle(handle, 1000));

//節(jié)流throttle代碼(定時器)
var throttle = function(func, delay) {            
    var timer = null;            
    return function() {                
        var context = this;               
        var args = arguments;                
        if (!timer) {                    
            timer = setTimeout(function() {                        
                func.apply(context, args);                        
                timer = null;                    
            }, delay);                
        }            
    }        
}        
function handle() {            
    console.log("函數(shù)節(jié)流");        
}        
window.addEventListener("scroll", throttle(handle, 1000));

// 節(jié)流throttle代碼(時間戳+定時器):
var throttle = function(func, delay) {     
    var timer = null;     
    var startTime = Date.now();     
    return function() {             
        var curTime = Date.now();             
        var remaining = delay - (curTime - startTime);             
        var context = this;             
        var args = arguments;             
        clearTimeout(timer);              
        if (remaining <= 0) {                    
            func.apply(context, args);                    
            startTime = Date.now();              
        } else {                    
            timer = setTimeout(func, remaining);              
        }      
    }
}
function handle() {      
    console.log("函數(shù)節(jié)流");
} 
window.addEventListener("scroll", throttle(handle, 1000));

用時間戳+定時器,當(dāng)?shù)谝淮斡|發(fā)事件時馬上執(zhí)行事件處理函數(shù),最后一次觸發(fā)事件后也還會執(zhí)行一次事件處理函數(shù)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101157.html

相關(guān)文章

  • JavaScript防抖節(jié)流

    摘要:概念函數(shù)防抖和函數(shù)節(jié)流,兩者都是優(yōu)化高頻率執(zhí)行代碼的一種手段。防抖任務(wù)頻繁觸發(fā)的情況下,只有任務(wù)觸發(fā)的間隔超過指定間隔的時候,任務(wù)才會執(zhí)行。節(jié)流指定時間間隔內(nèi)只會執(zhí)行一次任務(wù)一定時間內(nèi)方法只跑一次。 概念 函數(shù)防抖和函數(shù)節(jié)流,兩者都是優(yōu)化高頻率執(zhí)行js代碼的一種手段。 防抖:任務(wù)頻繁觸發(fā)的情況下,只有任務(wù)觸發(fā)的間隔超過指定間隔的時候,任務(wù)才會執(zhí)行。 節(jié)流:指定時間間隔內(nèi)只會執(zhí)行一次任...

    DevWiki 評論0 收藏0
  • 徹底弄懂函數(shù)防抖和函數(shù)節(jié)流

    摘要:若時間差大于間隔時間,則立刻執(zhí)行一次函數(shù)。不同點(diǎn)函數(shù)防抖,在一段連續(xù)操作結(jié)束后,處理回調(diào),利用和實(shí)現(xiàn)。函數(shù)防抖關(guān)注一定時間連續(xù)觸發(fā)的事件只在最后執(zhí)行一次,而函數(shù)節(jié)流側(cè)重于一段時間內(nèi)只執(zhí)行一次。 原博客地址,歡迎star 函數(shù)防抖和節(jié)流 函數(shù)防抖和函數(shù)節(jié)流:優(yōu)化高頻率執(zhí)行js代碼的一種手段,js中的一些事件如瀏覽器的resize、scroll,鼠標(biāo)的mousemove、mouseover...

    Mr_houzi 評論0 收藏0
  • 高級函數(shù)技巧-函數(shù)防抖節(jié)流

    摘要:封裝方法也比較簡單,書中對此問題也進(jìn)行了處理使用定時器,讓函數(shù)延遲秒后執(zhí)行,在此秒內(nèi),然后函數(shù)再次被調(diào)用,則刪除上次的定時器,取消上次調(diào)用的隊(duì)列任務(wù),重新設(shè)置定時器。 在實(shí)際開發(fā)中,函數(shù)一定是最實(shí)用最頻繁的一部分,無論是以函數(shù)為核心的函數(shù)式編程,還是更多人選擇的面向?qū)ο笫降木幊?,都會有函?shù)的身影,所以對函數(shù)進(jìn)行深入的研究是非常有必要的。 函數(shù)節(jié)流 比較直白的說,函數(shù)節(jié)流就是強(qiáng)制規(guī)定一...

    whinc 評論0 收藏0
  • JavaScript 函數(shù)節(jié)流 throttle 和防抖 debounce

    摘要:今天和別人聊到函數(shù)的節(jié)流和防抖,發(fā)現(xiàn)自己對這兩個的區(qū)別很是模糊,遂小小實(shí)踐一下,在此記錄,希望對需要的人有所幫助。防抖實(shí)現(xiàn)順利,但是兩個節(jié)流方法的執(zhí)行結(jié)果存在差異。 今天和別人聊到JavaScript函數(shù)的節(jié)流和防抖,發(fā)現(xiàn)自己對這兩個的區(qū)別很是模糊,遂小小實(shí)踐一下,在此記錄,希望對需要的人有所幫助。 節(jié)流 - 頻繁操作,間隔一定時間去做一件事 舉例說明:假定時間間隔為 500ms,頻繁...

    mmy123456 評論0 收藏0
  • 前端進(jìn)擊的巨人(八):淺談函數(shù)防抖節(jié)流

    摘要:隆重請出主角防抖與節(jié)流。防抖與節(jié)流的異同相同都是防止某一時間段內(nèi),函數(shù)被頻繁調(diào)用執(zhí)行,通過時間頻率控制,減少回調(diào)函數(shù)執(zhí)行次數(shù),來實(shí)現(xiàn)相關(guān)性能優(yōu)化。參考文章分鐘理解的節(jié)流防抖及使用場景函數(shù)防抖和節(jié)流 showImg(https://segmentfault.com/img/bVburM8?w=800&h=600); 本篇課題,或許早已是爛大街的解讀文章。不過春招系列面試下來,不少伙伴們還...

    _Zhao 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<