我只希望在表单字段中输入字母和数字。我已经使用正则表达式等尝试了许多变体,但无法禁用空格键或任何特殊字符键。
这是我的代码的最新副本:
document.querySelector('#upperCase').addEventListener('keyup', function(e) {
console.log(this.value);
if (e.which == '32') return false;
this.value = this.value.toUpperCase();
});
#upperCase {
text-transform: uppercase;
}
<form>
<input id="upperCase" maxlength="10" name="upperCase" type="text">
</form>
是否只能将字母和数字键入到输入文本框中?
这是我的jsfiddle:https://jsfiddle.net/bcjg7osr/29/
答案 0 :(得分:3)
一种实现方法是在输入中使用pattern属性。 patter属性的唯一问题是,在提交表单之前,它将不允许空格,在这种情况下,提交将无法进行,并且将要求用户更改输入。这将只允许字母和数字。
<input pattern = "[A-Za-z0-9]" id="upperCase" maxlength="10" name="upperCase"
type="text">
答案 1 :(得分:1)
您应该使用Event.preventDefault()
而不是return false
,因为它特定于jQuery。
您还应该使用keydown
而不是keyup
,因为keyup
在默认操作后会触发,因此为时已晚。 keypress
也可以选择。
此外,KeyboardEvent.which
返回一个number
,而不是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
和KeyboardEvent.code
,但是浏览器支持还不是很好。
关于您是否可以使用RegExp的问题,可以,可以使用RegExp。
但是,请注意,如果要防止任何无效字符出现在输入字段中,则不能在pattern
HTML属性中使用它,因为这只会在它属于的表单时验证其值已提交,如您在此处看到的:
document.getElementById('form').onsubmit = (e) => {
e.preventDefault();
};
<form id="form">
<input pattern = "\w*" type="text">
<button>SUBMIT</button>
<form>
此外,在keydown
事件侦听器中使用RegExp来验证输入的值将不起作用,因为您将获得上一个值,即最后一次击键之前的值:
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>
但是,如果您使用KeyboardEvent.key
,则可以使用RegExp来验证每个按下的键:
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。
如果您需要更高级的行为(例如以一种真正特定的方式格式化输入值的格式),该怎么做,是使用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" />
请注意,这只是一个超级基本的演示。您可能需要附加的逻辑来保持每次按键后光标的位置,并使其正常工作。理想的解决方案可能会监听多个事件。
答案 2 :(得分:1)
添加了“仅字母和数字”要求。我想您也想允许 Backspace 。您可能还会找到要允许的其他键(TAB,箭头键...)。
let allowedKeys = [..."01234567890abcdefghijklmnopqrstuvwxyz", "backspace"];
document.getElementById('upperCase').addEventListener('keydown', (e) => {
console.log(e.key);
if (!allowedKeys.includes(e.key.toLowerCase())) {
e.preventDefault();
return false;
}
e.target.value = e.target.value.toUpperCase();
});
#upperCase {
text-transform: uppercase;
}
<form>
<input id="upperCase" maxlength="10" name="upperCase" type="text">
</form>
答案 3 :(得分:0)
您可以在js文件中完成此操作:
document.querySelector('#upperCase').addEventListener('keyup',function(e){
if(e.which=='32') this.value='Dont enter space please'
else this.value=this.value.toUpperCase();
});