Функция защиты от сотрясения и удушения креветок и яиц

внешний интерфейс GitHub товар

задний план

     Когда я сегодня кодировал, я сделал окно поиска, и именно это окно поиска заставило меня и моих друзей на заднем плане прямо измениться с ферромагнитных братьев на пластмассовых. Так что случилось? Это на самом деле очень просто, но на самом деле очень беспомощно, то есть я разбил его доступ к интерфейсу со скоростью руки короля!

Когда мы обычно разрабатываем, будет много сценариев, которые часто запускают события, такие как запросы в реальном времени из окна поиска, onmousemove, изменение размера, onscroll и т. д. Иногда мы не можем или не хотим часто запускать события. Что нам делать? В это время следует использовать функцию защиты от сотрясений и функцию дросселирования!

Функция debounce (дебаунс)

Что такое анти-шейк? Одно и то же событие срабатывает несколько раз за короткое время, выполняется только последний раз или только при старте, середина не выполняется. Поднимите каштан: Вы идете к автобусу, держите людей, водитель-мастер не будет водить во время процесса сплошных людей, только когда последний человек сядет в автобус, старый водитель будет водить!嘿嘿! Мы сохраняем событие onmousemove, чтобы сохранить цифровой +1 в качестве примера. код показывает, как показано ниже:

  • Без стабилизации и троттлинга цифры растут как эпилепсия
//变量初始化
var xcd = document.getElementById('xcd'),
    count = 1; 
//要执行的操作 数字+1
function doSomething() {
    xcd.innerHTML = count++;
};
//触发onmousemove事件 正常情况下
xcd.onmousemove = doSomething;

  • Используйте зеленую базовую версию антивибратора
//绿色基础版:
function debounce(doSomething,wait){
    var timeout;//需要一个外部变量,为增强封装,所以使用闭包
    return function(){
        var _this = this,
            _arguments = arguments;//arguments中存着e
        clearTimeout(timeout);
        timeout = setTimeout(function(){
            doSomething.apply(_this,_arguments);   
        },wait);
    }
}
//触发onmousemove事件
xcd.onmousemove = debounce(doSomething,1000);

     Эта зеленая базовая версия проста, но она смогла решить большинство сценариев спроса, в использовании этой версии нет особой необходимости! Это почти как есть кротон, duangduangduang, очень гладкий! Но будут некоторые другие требования.Например, если я хочу выполнить немедленно, оно выполняется один раз в начале события непрерывного триггера, а затем оно не будет выполняться после непрерывного триггера.Мы используем isImmediate, чтобы указать, следует ли выполнить немедленно. Код выглядит следующим образом:

  • Используйте версию Anti-Shake с немедленным выполнением
//立即执行版
function debounce(doSomething,wait,isImmediate){
    var timeout;
    return function(){
        var _this = this,
            _arguments = arguments;
        clearTimeout(timeout);
        if(isImmediate){
            var isTrigger = !timeout;
            timeout = setTimeout(function(){
                timeout = null;
            }, wait)
            isTrigger&&doSomething.apply(_this,_arguments);
        }else{
            timeout = setTimeout(function(){
                doSomething.apply(_this,_arguments);   
            },wait);
        }
    }
}
//触发onmousemove事件
xcd.onmousemove = debounce(doSomething,1000,true);

функция дроссельной заслонки

     Что такое дросселирование? Регулирование — это процесс непрерывного запуска событий для выполнения функции через равные промежутки времени. Дросселирование снизит частоту выполнения, например, каждую 1 секунду функция будет выполняться только один раз, независимо от того, сколько раз событие запускается за эту 1 секунду.

Для каштана: вы пьете много воды каждый день, но вам не придется идти к каждому пьющую глоток воды в унитаз, если есть горшки друзей Цзян Зи, советую вам пойти в больницу, чтобы увидеть Это → → → Туалет, чтобы увидеть вас неприятностей - хотя вы пили, но не всегда ходили в туалет, обычный ритм! Питьевая вода пить на туалете! Питьевая вода пить на туалете! Хотя это был триггер, но каждый раз в эксплуатации только один раз, который является функцией дроссельной заслонки!

  • Использование временной метки версии дроссельной заслонки
//绿色基础版之时间戳版
function throttle(doSomething,wait){
    var _this,
        _arguments,
        initTime = 0;
    return function(){
        var now = +new Date();//将new date()转化为时间戳
            _this = this;
            _arguments = arguments;
        if(now - initTime>wait){
            doSomething.apply(_this,_arguments);
            initTime = now;
        }
    }
}
//触发onmousemove事件
xcd.onmousemove = throttle(doSomething,1000);

  • Используйте версию с дроссельным таймером
//绿色基础版之定时器版
function throttle(doSomething,wait){
    var timeout;
    return function(){
        var _this = this;
            _arguments = arguments;
        if(!timeout){
            timeout = setTimeout(function(){
                timeout = null;
                doSomething.apply(_this,_arguments);
            },wait);
        };
    }
}
//触发onmousemove事件
xcd.onmousemove = throttle(doSomething,1000);

     Аналогичным образом, две упомянутые выше экологически чистые базовые версии также могут удовлетворить большинство сценариев спроса! В чем разница между этими двумя версиями? Версия с отметкой времени будет выполняться один раз в начале и не будет выполняться повторно в течение последнего интервала; версия с таймером не будет выполняться в начале и будет выполняться снова в течение последнего интервала. Вы можете выбрать подходящую версию в соответствии с вашими реальными потребностями.

     Конечно, могут быть некоторые продукты BT, которые будут спрашивать вас, можете ли вы сначала выполнить их немедленно, выполнить с фиксированным интервалом в середине и выполнить в конце? Пришло время установить Б. Для такого фронтенда, как я, это просто необходимо, просто соедините их вместе, и двойной ремонт — мой любимый *@o@*

  • Используйте двойной меч удушения
//节流之双剑合璧版
function throttle(doSomething, wait) {
    var timeout, _this, _arguments,
        previous = 0;

    var later = function() {
        previous = +new Date();
        timeout = null;
        doSomething.apply(_this, _arguments)
    };
    var throttled = function() {
        var now = +new Date();
        //下次触发 doSomething 剩余的时间
        var remaining = wait - (now - previous),
            _this = this;
            _arguments = arguments;
         // 如果没有剩余的时间了
        if (remaining <= 0) {
            if (timeout) {
                clearTimeout(timeout);
                timeout = null;
            }
            previous = now;
            doSomething.apply(_this, _arguments);
        } else if (!timeout) {
            timeout = setTimeout(later, remaining);
        }
    };
    return throttled;
}
//触发onmousemove事件
xcd.onmousemove = throttle(doSomething,1000);

Глубокое понимание функции анти-тряски и дросселирования, разумный выбор анти-тряски или дросселирования может решить многие болезни Паркинсона, это незаменимый продукт для путешествий и домашней жизни! Хорошо, просто соус, я это я, я вижу, что злюсь! Время от времени я буду делиться некоторыми знаниями о фронтенде и точками интервью.

Ссылка: https://github.com/mqyqingfeng/Blog