91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中節流的示例分析

發布時間:2021-03-05 11:40:24 來源:億速云 閱讀:160 作者:小新 欄目:web開發

小編給大家分享一下JavaScript中節流的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

前言

我們來聊一聊節流——另一個優化函數的思想。

我們還是以移動事件舉例

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <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></head><body>
    <p id="wrapper"></p>

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

        var oWrapper = document.querySelector('#wrapper');
		oWrapper.onmousemove = moveAction;
    </script></body></html>

它的效果是這樣:

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 <= 0 || 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中節流的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

红安县| 普宁市| 正安县| 溧阳市| 清远市| 三原县| 琼中| 古丈县| 饶平县| 湘阴县| 岳西县| 图片| 乌鲁木齐县| 秦安县| 永嘉县| 砚山县| 东乌珠穆沁旗| 巩留县| 郯城县| 琼结县| 深泽县| 江西省| 浠水县| 高陵县| 水城县| 嘉黎县| 读书| 通州区| 隆林| 岚皋县| 吴旗县| 黄平县| 曲阜市| 孟州市| 宜丰县| 巨鹿县| 田东县| 涟水县| 民乐县| 浮梁县| 石棉县|