如何禁用滚轮改变输入数字字段中的数字?我已经使用 Webkit 特有的 CSS 来移除微调按钮,但我想完全取消此行为。我喜欢使用 type=number
,因为这会在 iOS 上带来一个漂亮的键盘。
如何禁用滚轮改变输入数字字段中的数字?我已经使用 Webkit 特有的 CSS 来移除微调按钮,但我想完全取消此行为。我喜欢使用 type=number
,因为这会在 iOS 上带来一个漂亮的键盘。
防止像其他人建议的那样在输入数字元素上触发鼠标滚轮事件的默认行为(调用“blur()”通常不是首选方式,因为那不是用户想要的)。
但是,我建议只在元素处于焦点状态时侦听鼠标滚轮事件,而不是一直在所有输入数字元素上进行侦听(这是问题出现的情况)。否则当鼠标指针位于输入数字元素上方时,用户将无法滚动页面。
jQuery解决方案:
// disable mousewheel on a input number field when in focus
// (to prevent Chromium browsers change the value when scrolling)
$('form').on('focus', 'input[type=number]', function (e) {
$(this).on('wheel.disableScroll', function (e) {
e.preventDefault()
})
})
$('form').on('blur', 'input[type=number]', function (e) {
$(this).off('wheel.disableScroll')
})
将焦点事件委托给周围的表单元素-以避免过多的事件监听器,这对性能不利。
这类似于@Simon Perepelitsa在纯JS中的答案,但更简单, 因为它在文档元素上放置了一个事件监听器,用于所有输入,并检查焦点元素是否为数字输入类型:
document.addEventListener("wheel", function(event){
if(document.activeElement.type === "number"){
document.activeElement.blur();
}
});
如果您希望关闭某些字段的值滚动行为(按类/ ID),而不关闭其他字段,则只需添加&&
和相应的文档选择器即可:document.addEventListener("wheel", function(event){
if(document.activeElement.type === "number" &&
document.activeElement.classList.contains("noscroll"))
{
document.activeElement.blur();
}
});
以此为基础:<input type="number" class="noscroll"/>
如果输入具有noscroll类,则在滚动时它不会改变,否则一切保持不变。
wheel
而不是 mousewheel
,以适应现代浏览器。 参考:https://developer.mozilla.org/zh-CN/docs/Web/API/Element/wheel_eventPS. 我不是点踩的人。 - vee<input type="number">
中的输入类型,而不是在<custom number="some_value">
中的属性。如果条件不满足,它会尽快退出。这个想法是为了避免有很多监听器,并且在元素动态添加和删除时也能正常工作。欢迎提出改进建议。 - Peter Rakmanyi$(document).on("wheel", "input[type=number]", function (e) {
$(this).blur();
});
您可以简单地使用HTML onwheel 属性。
这个选项对页面上其他元素的滚动没有影响。
为所有输入添加侦听器不适用于动态创建的输入。
此外,您可以使用CSS删除输入箭头。
input[type="number"]::-webkit-outer-spin-button,
input[type="number"]::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
input[type="number"] {
-moz-appearance: textfield;
}
<input type="number" onwheel="this.blur()" />
<input type="number" onwheel="return false;">
- Donni我有一个替代方案。我认为大多数常见的建议是触发模糊事件,问题在于它具有意想不到的副作用。意外移除焦点状态并不总是好事。
为什么不使用这个呢?
<input type="number" onwheel="return false;" />
这非常简单且直接,易于实现,并且我可以想到没有任何副作用。
onmousewheel="return false;"
的效果如预期一样。 - TPoschelonWheel={e => e.target.blur()}
。我不确定为什么Mac没有提供禁用它的选项。 - Surjith S MReactJS解决方案
对于需要React解决方案的人,这是一个onWheel
处理程序,用于您的type="number"
输入,以防止数字更改并防止页面在用户尝试滚动输入时滚动。最后,它将重新聚焦于输入,以便用户可以按预期继续编辑:
const numberInputOnWheelPreventChange = (e) => {
// Prevent the input value change
e.target.blur()
// Prevent the page/container scrolling
e.stopPropagation()
// Refocus immediately, on the next tick (after the current function is done)
setTimeout(() => {
e.target.focus()
}, 0)
}
return <input type="number" onWheel={numberInputOnWheelPreventChange}/>
input = document.getElementById("the_number_input")
input.addEventListener("mousewheel", function(event){ this.blur() })
查看相关问题的jQuery示例和跨浏览器解决方案,请参见:
$(':input[type=number]' ).live('mousewheel',function(e){ $(this).blur(); });
我使用了blur而不是prevent default,这样就不会阻止页面滚动了! - Thibaut Colson$(':input [type = number] ')。on('mousewheel',function(e){ $(this)。blur(); });
- Saeidwheel
代替mousewheel
,以适应现代浏览器。参考:https://developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event - vee这个问题有更好的解决方案。 Blur 会移除输入框的焦点,但这不是你想要的副作用。相反,你应该使用 evt.preventDefault。这可以阻止用户滚动时输入框的默认行为。以下是代码:
input = document.getElementById("the_number_input")
input.addEventListener("mousewheel", function(evt){ evt.preventDefault(); })
wheel
代替mousewheel
,以适应现代浏览器。参考:https://developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event - vee对于任何正在使用React并需要解决此问题的人,我已经发现最简单的方法是在Input组件中使用onWheelCapture属性,就像这样:
onWheelCapture={e => {
e.target.blur()
}}
target
没有blur()
,所以我不得不使用e.currentTarget.blur()
来使其工作。 - M. Lee首先,你必须通过以下方式之一停止鼠标滚轮事件:
mousewheel.disableScroll
来禁用它。e.preventDefault();
拦截它。el.blur();
将焦点从元素上移除。前两种方法都会停止窗口滚动,而最后一种方法则会移除元素的焦点,这两种结果都是不希望出现的。
一个解决方法是在延迟后使用 el.blur()
并重新聚焦元素:
$('input[type=number]').on('mousewheel', function(){
var el = $(this);
el.blur();
setTimeout(function(){
el.focus();
}, 10);
});
var hadFocus = el.is(':focus');
,然后加入一项保护措施,仅在hadFocus为true时设置超时。 - Rob Dawson
event.preventDefault()
的onscroll
处理程序时会发生什么? - robertc