Вы можете условно запретить запуск события click на вашем слайдере, зарегистрировав прослушиватель событий click
, который использует переменную moved
совместно с прослушивателями событий mousedown
и mousemove
.
The *Опция 1007 *{ passive: true }
указывает, что слушатель не вызывает event.preventDefault()
и экономит много времени ЦП, особенно для события mousemove
, которое может запускаться несколько раз в секунду.
true
параметр указывает, что прослушиватель события должен быть вызван до того, как событие начнет всплывать от целевого элемента. Это позволяет предотвратить распространение даже на слушателей, которые уже были добавлены в тот же элемент, если только они не установили useCapture
в true
.
const slider = document.querySelector('input[type="range"]');
// prevent this if mousemove occurred between mousedown and mouseup
slider.addEventListener('click', () => {
console.log('click event fired on slider');
});
// fires just before click event
slider.addEventListener('mouseup', () => {
console.log('mouseup event fired on slider');
});
let moved = false;
// reset for each potential click
slider.addEventListener('mousedown', () => {
moved = false;
});
// indicate cancellation should occur for click
slider.addEventListener('mousemove', () => {
moved = true;
}, { passive: true });
// prevents click event if mousemove occurred between mousedown and mouseup
slider.addEventListener('click', event => {
if (moved) {
event.preventDefault();
event.stopImmediatePropagation();
}
}, true);
<input type="range" />