我试图通过键入或粘贴输入使用jQuery和regex禁用某些值的输入(任何不是字母数字或连字符应该返回false并且调用e.preventDefault()
来停止输入)。每次我运行这个测试时,无论输入是什么都会返回false而失败,我无法弄清楚我在这里做错了什么。
当我在节点控制台valid.test("hello-world")
(或变量等于" hello-world")中运行测试时,它返回为真,当我valid.test("hello_world")
它来时返回为假,但当我使用下面的代码执行此操作时,无论输入如何,每次都会返回false。
我的代码:
jQuery('#input').on('keydown paste', function(e) {
var input = e.target.value;
var isValid = /^[a-zA-Z\d-]+$/;
var tester = isValid.test(input);
if (tester === false) {
e.preventDefault();
console.log("Input allowed? " + tester);
} else if (tester) {
console.log("Input allowed? " + tester);
}
});
在节点控制台中,我得到以下结果:
"hello-world" = true
"hello_world" = false
"hello." > false
"goodness gracious" = false
"goodness-gracious" = true
"goodness123" = true
"goodness!!" = false
我在这里缺少什么?
编辑:我创建了一个codepen来显示我得到的结果: https://codepen.io/anon/pen/JpdMgM
答案 0 :(得分:2)
您需要转义字符类中的/^[a-zA-Z\d\-]+$/
。因此,您的正则表达式将为var data = ["hello-world","hello_world","hello.","goodness gracious","goodness-gracious","goodness123","goodness!!"],
result = data.map(word => /^[a-zA-Z\d\-]+$/.test(word));
console.log(result);
_innerInterfaceMock.Raise(o => o.OnCompleted+=null, new EventArgs());

答案 1 :(得分:2)
您需要将keypress
和paste
的逻辑分开,因为e.preventDefault()
导致您遇到问题。使用this answer中所示的相同逻辑,您可以测试粘贴的输入。
let r = /^[a-zA-Z\d-]+$/
$('#input').bind({
keydown: function(e) {
return r.test(e.key)
},
paste: function(e) {
if(!r.test(e.originalEvent.clipboardData.getData('text'))) {
e.preventDefault()
}
}
});

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="input"/>
&#13;
答案 2 :(得分:0)
对于这两个事件,您将在内容中出现输入值之前获取输入值。
对于“粘贴”事件,您可以使用类似
的内容$("#textareaid").bind("paste", function(e){
// access the clipboard using the api
var pastedData = e.originalEvent.clipboardData.getData('text');
alert(pastedData);
} );
请参阅this以获取进一步的参考。
使用“keydown”,像ctwheels的回答可以起作用。