你可以试试这个:
这个
input
事件检查值的变化是否与步长值匹配,并根据跳跃值进行相应调整。
编辑:在这种情况下,为了回答您的评论,我们将使用标志并添加回
keydown
事件
向输入事件侦听器添加一个条件,以防止在手动更改值时出现不必要的行为
document.addEventListener('DOMContentLoaded', () => {
const input = document.querySelector('input[type="number"][min="1"][max="1000"][step="1"]');
const jump = parseInt(input.getAttribute('jump'), 10);
let previousValue = parseInt(input.value, 10);
let isManualChange = false;
input.addEventListener('keydown', (event) => {
if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {
event.preventDefault();
const currentValue = parseInt(input.value, 10);
if (event.key === 'ArrowUp') {
input.value = currentValue + jump;
} else if (event.key === 'ArrowDown') {
input.value = currentValue - jump;
}
previousValue = parseInt(input.value, 10);
isManualChange = false;
} else {
isManualChange = true;
}
});
input.addEventListener('input', (event) => {
const currentValue = parseInt(input.value, 10);
const step = parseInt(input.getAttribute('step'), 10);
if (!isManualChange && Math.abs(currentValue - previousValue) === step) {
if (currentValue > previousValue) {
input.value = previousValue + jump;
} else {
input.value = previousValue - jump;
}
}
previousValue = parseInt(input.value, 10);
});
});
<input type="number" min="1" max="1000" step="1" jump="5" value="100" />