Я использую замыкания, чтобы убедиться, что действует только одно из многих событий, связанных с элементом, например: $('.textInputs').on('keyup.my.evt change.my.evt', once(options));
Я использую подчеркивание _.debounce
внутри закрытия функции once
. Все работает, если я вношу изменения в один ввод и жду, прежде чем внести изменения в другой ввод. Если я внесу изменение в один ввод и быстро перейду к следующему и внесу изменение за секунду до истечения времени ожидания на первом вводе, то функция debounced будет выполняться только для второго ввода. Это говорит мне, что оба входа используют одну и ту же функцию, возвращенную из debounce, но я не уверен, как изменить структуру моего кода, чтобы каждый вход использовал свою собственную функцию debounce.
Функция устранения отказов:
var doStuff = function(eleObj, options){ console.log(eleObj, options); } // the function that does stuff
var debouncedDoStuff = _debounce(doStuff, 2000); // debouncing doStuff()
Определение однократного закрытия:
var once = function (options) {
var eventType = null;
function doOnce(e) {
if (!eventType) {
eventType = e.type; // only the first eventType we get will be registered
}
if (e.type == eventType) {
debouncedDoStuff($(this), options); // calling the debounced do stuff func
}
}
return doOnce;
}
Документ готов:
$(document).ready(function(){
var options = {foo:'bar', baz:'biz'};
$('.textInputs').on('keyup.my.evt change.my.evt', once(options));
});
Я сделал скрипт, демонстрирующий проблему: https://jsfiddle.net/enzt7q90/
Пояснения Приведенный выше код был сокращен до минимума, показывающего проблему. Реальная цель состоит в том, чтобы doStuff был присоединен к процессу ajax, который сохраняет любые изменения, внесенные в табличные данные.
Я также должен отметить, что замыкание Once не похоже на .one() в jQuery. Например, .one('keyup change', function(){}) будет выполнять функцию дважды, когда нажата клавиша табуляции (один раз для нажатия клавиши и еще раз для изменения), тогда как способ, которым я использую однократное закрытие, функция только exec'd один раз для этих двух событий.