Вместо обновления данных для каждого символа мы можем обновить изменение при событии размытия ввода. Что будет срабатывать только после того, как ввод будет размытым.
Таким образом, это обновляется только тогда, когда ввод размывается (например, когда мы щелкаем за пределами ввода)
function onBlur() {
let data = {
title: titleUserTab.value,
url: urlUserTab.value,
};
saveOption('dataUserTab',data);
}
titleUserTab.addEventListener('blur', onBlur);
urlUserTab.addEventListener('blur', onBlur);
Но если вы хотите, чтобы данные обновлялись динамически перед размытием, лучше использовать debounce. Поэтому, когда после каждого изменения мы вызываем функцию сохранения с задержкой, если новое изменение происходит до того, как задержка закончилась, задержка отменяется, и она ожидает завершения новой задержки. Это похоже на ваш подход, но проще, поскольку нам не нужно очищать слушателей событий и часто их добавлять. Функция противодействия будет выглядеть так:
function debounce(func, wait, immediate) {
var timeout;
return function executedFunction() {
var context = this;
var args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
function onBlur() {
let data = {
title: titleUserTab.value,
url: urlUserTab.value,
};
saveOption('dataUserTab', data);
}
titleUserTab.addEventListener('input', debounce(onBlur, 1000));
urlUserTab.addEventListener('input', debounce(onBlur, 1000));
Приведенный выше код ожидает 1 секунду перед обновлением данных. ref
Мы также можем использовать loda sh библиотеку для противодействия