2 回答

TA貢獻1829條經(jīng)驗 獲得超4個贊
您可以通過注冊與您的和事件偵聽器click共享moved變量的事件偵聽器,有條件地防止在滑塊上觸發(fā)單擊事件。mousedownmousemove
該{ passive: true }選項表示偵聽器不調(diào)用event.preventDefault(),并且節(jié)省了大量 CPU 時間,特別是對于mousemove每秒可以觸發(fā)多次的事件。
該true參數(shù)指示在事件開始從目標元素冒泡之前應(yīng)調(diào)用事件偵聽器。這允許它甚至可以防止傳播到已經(jīng)添加到同一元素上的偵聽器,只要它們也沒有設(shè)置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" />

TA貢獻1868條經(jīng)驗 獲得超4個贊
您應(yīng)該刪除包含event.preventDefault();.
為此,您必須將函數(shù)引用保存到一個變量中,如下所示:
const preventClickHandler = (e) => e.preventDefault;
slider.addEventListener('mouseup', () => {
isDown = false;
// Disable click event (for ever unfortunately)
if(moved === true) {
this.addEventListener('click', preventClickHandler);
} else {
this.removeEventListener('click', preventClickHandler);
}
})
添加回答
舉報