修复你的代码
您应该使用Event.preventDefault()
而不是return false
,因为这是特定于 jQuery 的。
您还应该使用keydown
而不是keyup
, 因为keyup
在默认操作之后触发,所以阻止它为时已晚。keypress
也可能是一种选择。
此外,KeyboardEvent.which
返回 a ,而不是number
a string
,因此最好不要这样做:e.which === 32
e.which == '32'
document.querySelector('#upperCase').addEventListener('keydown', function(e) {
console.log(e.which);
if (e.which === 32) {
e.preventDefault();
}
});
#upperCase {
text-transform: uppercase;
}
<form>
<input id="upperCase" maxlength="10" name="upperCase" type="text">
</form>
关于如何获得按下的键的旁注
但是,作为旁注,请注意两者KeyboardEvent.which
和KeyboardEvent.keyCode
目前已弃用。它们较新的选项是KeyboardEvent.key
and KeyboardEvent.code
,但浏览器支持还不是很好。
使用 RegExp 仅验证字段
关于您是否可以使用RegExp的问题,是的,您可以使用 RegExp。
但是,请注意,pattern
如果您想防止任何无效字符出现在输入字段中,则不能在 HTML 属性中使用它,因为这只会在提交其所属的表单时验证其值,如您在此处看到的:
document.getElementById('form').onsubmit = (e) => {
e.preventDefault();
};
<form id="form">
<input pattern = "\w*" type="text">
<button>SUBMIT</button>
<form>
使用 RegExp 根据输入值防止 keyDown 事件
此外,在事件侦听器中使用 RegExpkeydown
来验证输入的值将不起作用,因为您将获得上一个值,即最后一次击键之前的值:
document.querySelector('#upperCase').addEventListener('keydown', function(e) {
const isInalid = !/^\w*$/.test(this.value);
console.log(`value = "${ this.value }", which is ${ /^\w*$/.test(this.value) ? 'still valid.' : 'now invalid.' }`);
if (isInalid) {
e.preventDefault();
}
});
#upperCase {
text-transform: uppercase;
}
<form>
<input id="upperCase" maxlength="10" name="upperCase" type="text">
</form>
使用 RegExp 防止基于按下的键的 keyDown 事件
但是,您可以使用 RegExp 来验证每个按下的键,如果您使用KeyboardEvent.key
:
document.querySelector('#upperCase').addEventListener('keydown', function(e) {
const key = e.key;
const isCharacter = key.length === 1;
console.log(`e.key = ${ key } (${ isCharacter ? 'character' : 'special key' })`);
// We don't want to prevent special keys like backspace or delete:
if (isCharacter && !/\w/.test(e.key)) {
e.preventDefault();
}
});
#upperCase {
text-transform: uppercase;
}
<form>
<input id="upperCase" maxlength="10" name="upperCase" type="text">
</form>
请注意,您仍然可以使用 执行与此类似的操作e.which
,但在这种情况下,您将不会使用 RegExp。
✨ 使用 RegExp 从输入事件中强制执行某种格式
如果您需要更高级的行为,例如以非常特定的方式格式化输入的值,您可以做的是使用input
事件来代替。
例如,假设我们想要一个带有千位分隔符的数值输入字段。一个超级基本的实现看起来像这样:
document.querySelector('#upperCase').addEventListener('input', function(e) {
const numericValueMatch = this.value.match(/\d+/g);
if (!numericValueMatch) {
this.value = '';
return;
}
const valueAsNumber = parseInt(numericValueMatch.join(''));
console.log(`valueAsNumber = ${ valueAsNumber }`);
// toLocaleString is not the best option, but that's ok for this example:
this.value = valueAsNumber.toLocaleString();
});
<input id="upperCase" maxlength="10" type="text" />
请注意,这只是一个超级基本的演示。您需要额外的逻辑来在每次按键后保持光标的位置,并使其正常工作。理想的解决方案可能会监听多个事件。