国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js---節(jié)流

olle / 1848人閱讀

摘要:節(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;
           }
       }
   }

這樣寫法適用于,將要執(zhí)行的函數(shù)直接賦值給事件。btn.addEventListener("click",throttle(addSelf,2000),false);因為throttle返回的是一個函數(shù),直接賦值給事件可以觸發(fā)執(zhí)行。

如果在事件的回調(diào)中執(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

相關(guān)文章

  • JS進(jìn)階篇--JS函數(shù)節(jié)流(throttle)

    摘要:函數(shù)節(jié)流的原理函數(shù)節(jié)流的原理挺簡單的,估計大家都想到了,那就是定時器。在高級程序設(shè)計一書有介紹函數(shù)節(jié)流,里面封裝了這樣一個函數(shù)節(jié)流函數(shù),它把定時器存為函數(shù)的一個屬性個人的世界觀不喜歡這種寫法。 什么是函數(shù)節(jié)流? 介紹前,先說下背景。在前端開發(fā)中,有時會為頁面綁定resize事件,或者為一個頁面元素綁定拖拽事件(其核心就是綁定mousemove),這種事件有一個特點,就是用戶不必特地?fù)v亂...

    cpupro 評論0 收藏0
  • 談?wù)?em>js中的函數(shù)節(jié)流

    摘要:為了解決這些問題,就可以使用定時器對函數(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)致瀏覽器掛起,有時候甚...

    sanyang 評論0 收藏0
  • JS進(jìn)階篇3---函數(shù)“節(jié)流” VS “防抖”

    摘要:目的都是為了降低回調(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 代碼的手段,那具體它們有什么異同點呢?有對這兩個概念不太了解的小伙伴...

    hlcc 評論0 收藏0
  • js 防抖 節(jié)流 JavaScript

    摘要:此時需要采用防抖和節(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...

    int64 評論0 收藏0
  • 詳談js防抖和節(jié)流

    摘要:本文會分別介紹什么是防抖和節(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í)行代碼: 沒有防抖 ...

    shevy 評論0 收藏0
  • JS進(jìn)階篇1---函數(shù)節(jié)流(throttle)

    摘要:主要實現(xiàn)思路就是通過定時器,通過設(shè)置延時時間,在第一次調(diào)用時,創(chuàng)建定時器,寫入需要執(zhí)行的函數(shù)。如果這時前一個定時器暫未執(zhí)行,則將其替換為新的定時器。 JS中的函數(shù)節(jié)流 一、什么是函數(shù)節(jié)流(throttle) 概念:限制一個函數(shù)在一定時間內(nèi)只能執(zhí)行一次。 舉個栗子,坐火車或地鐵,過安檢的時候,在一定時間(例如10秒)內(nèi),只允許一個乘客通過安檢入口,以配合安檢人員完成安檢工作。上例中,每1...

    zhou_you 評論0 收藏0

發(fā)表評論

0條評論

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