Это решение, аналогичное CMS, но решающее для меня несколько ключевых вопросов:
- Поддерживает несколько входов, задержки могут выполняться одновременно.
- Игнорирует ключевые события, которые не изменили значение (например, Ctrl, Alt + Tab).
- Решает условие гонки (когда обратный вызов выполнен и значение уже изменено).
var delay = (function() {
var timer = {}
, values = {}
return function(el) {
var id = el.form.id + '.' + el.name
return {
enqueue: function(ms, cb) {
if (values[id] == el.value) return
if (!el.value) return
var original = values[id] = el.value
clearTimeout(timer[id])
timer[id] = setTimeout(function() {
if (original != el.value) return // solves race condition
cb.apply(el)
}, ms)
}
}
}
}())
Использование:
signup.key.addEventListener('keyup', function() {
delay(this).enqueue(300, function() {
console.log(this.value)
})
})
Код написан в стиле, который мне нравится, вам может понадобиться добавить несколько точек с запятой.
Что нужно иметь в виду:
- Уникальный идентификатор генерируется на основе идентификатора формы и имени входа, поэтому они должны быть определены и уникальны, иначе вы можете настроить его в соответствии с вашей ситуацией.
- задержка возвращает объект, который легко расширить для собственных нужд.
- Исходный элемент, используемый для задержки, привязан к обратному вызову, поэтому
this
работает как положено (как в примере).
- Пустое значение игнорируется во второй проверке.
- Остерегайтесь enqueue , сначала он ожидает миллисекунды, я предпочитаю это, но вы можете переключить параметры так, чтобы они соответствовали
setTimeout
.
Решение, которое я использую, добавляет еще один уровень сложности, позволяя, например, отменить выполнение, но это хорошая база для построения.