首頁 > web前端 > js教程 > JavaScript專題之四:節流

JavaScript專題之四:節流

coldplay.xixi
發布: 2021-03-05 09:41:19
轉載
2448 人瀏覽過

JavaScript專題之四:節流

目錄

  • #前言
  • 一、核心與基本實作
  • 二、節流進階
  • 寫在最後

(免費學習推薦:javascript影片教學

前言

我們來聊一聊節流-另一個最佳化函數的想法。

我們還是以移動事件舉例

nbsp;html>
    <meta>
    <meta>
    <meta>
    <title>Document</title>
    <style>
        #wrapper {
            width: 100%;
            height: 140px;

            background: rgba(0, 0, 0, 0.8);

            color: #fff;
            font-size: 30px;
            font-weight: bold;
            line-height: 140px;
            text-align: center;
        }
    </style>
    <p></p>

    <script>
        var count = 1;
        function moveAction () {
            oWrapper.innerHTML = count++;
        }

        var oWrapper = document.querySelector(&#39;#wrapper&#39;);
		oWrapper.onmousemove = moveAction;
    </script>
登入後複製

它的效果是這樣:

JavaScript專題之四:節流

一、核心與基本實作

節流的原理很簡單:如果你持續觸發某個事件,特定的時間間隔內,只執行一次。

關於節流的實現,有兩種主流的實現方式:

  1. #時間戳思路
  2. 定時器思路

1.1 時間戳思路

顧名思義,透過兩個時間戳來控制時間間隔,當觸發事件的時候:

  1. 我們取出當前的時間戳now;
  2. 然後減去先前執行時的時間戳(首次值為0 ) prev;
  3. 如果大now - prev > wait,證明時間區間維護結束,執行指定事件,更新prev

根據這個思路,我們就可以實作第一版程式碼了:

oWrapper.onmousemove = throttle(moveAction, 1000);function throttle(func, wait) {
    var _this, arg;
    var prev = 0; // 上一次触发的时间,第一次默认为0

    return function () {
        var now = Date.now(); // 触发时的时间
        _this = this;
        if (now - prev > wait) {
            func.apply(_this, arg); // 允许传入参数,并修正this
            prev = now; // 更新上一次触发的时间
        }
    }}
登入後複製

來看看借助它,效果是什麼樣的:

JavaScript專題之四:節流

我們可以看到:

  1. 當滑鼠移入的時候,事件立刻執行
  2. 每過1s 會執行一次,且移動2.5s會執行2次,意味著動作停止後不會再執行

1.2 定時器想法

利用定時器來保證間隔時間內事件的觸發次數

  1. 建立定時器timer# ,記錄目前是否在週期內;
  2. 判斷定時器是否存在,若存在則直接結束,否則執行事件;
  3. ##wait時間之後再次執行,並且清除定時器;
當觸發事件的時候,我們設定一個定時器,再觸發事件的時候,如果定時器存在,就不執行,直到定時器執行,然後執行函數,清空定時器,這樣就可以設定下個定時器。

function throttle(func, wait) {
    var _this, arg;
    var timer; // 初始化
    return function () {
        _this = this; // 记录this
        arg = arguments; // 记录参数数组
        if (timer) return; // 时候未到
        timer = setTimeout(() => {
            func.apply(_this, arg); // 允许传入参数,并修正this
            timer = null;
        }, wait);
    }}
登入後複製
來看看借助它,效果是什麼樣的:

JavaScript專題之四:節流

#但是,我們可以看到:

    #當滑鼠移入的時候,事件不會立刻執行;
  1. 滑鼠自訂後
  2. wait間隔後會執行一次
1.3 兩個想法的差異

時間戳計時器 「起點」立即執行n 秒後執行#「終點」停止後不會執行停止會再執行一次

二、節流進階

結合兩個想法完成一個可以立即執行,且停止觸發後再執行一次的節流方法:

// 第三版function throttle(func, wait) {
    var timeout, context, args, result;
    var previous = 0;

    var later = function() {
        previous = +new Date();
        timeout = null;
        func.apply(context, args)
    };

    var throttled = function() {
        var now = +new Date();
        //下次触发 func 剩余的时间
        var remaining = wait - (now - previous);
        context = this;
        args = arguments;
         // 如果没有剩余的时间了或者你改了系统时间
        if (remaining  wait) {
            if (timeout) {
                clearTimeout(timeout);
                timeout = null;
            }
            previous = now;
            func.apply(context, args);
        } else if (!timeout) {
            timeout = setTimeout(later, remaining);
        }
    };
    return throttled;}
登入後複製
效果演示如下:

JavaScript專題之四:節流

我在看程式碼的時候,我是反覆列印數據才理解為什麼會這樣做,一起加油~

相關免費學習推薦:javascript##(影片) #

以上是JavaScript專題之四:節流的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板