【发布时间】:2023-04-08 02:53:01
【问题描述】:
如果输入框中的组合值与他们最新的按键没有传递正则表达式,我如何防止用户更改输入框中的字符串?
我看到了各种关于如何使用按键来测试单个字符的示例,但我需要将整个值与正则表达式匹配,而不仅仅是他们按下的键。
例如,文本框需要符合以下正则表达式:
"^023-[0-9]{0,7}$"
因此,如果他们想将"023" 更改为"23",则应该在他们删除0 字符时阻止他们。在023 之后删除- 也是如此。一旦他们在023 之后输入超过 7 个数字,它也应该阻止他们。 这不能在模糊时完成。必须在每次击键后完成。 性能不是问题。
如果我在 jQuery 中使用 keypress() 事件,并像这样获取输入元素的值:
$(this).val()
然后我只会在他们按下键之前得到值 - 而不是之后。因此,无法针对我的正则表达式测试输入。我不能简单地将按下的键附加到这个字符串,因为我不能假设他们只在字符串的最右侧输入键。
我研究了 keydown/keyup 事件,虽然 keyup 似乎在用户按下某个键后给了我输入的当前值,但我发现很难消除他们键入的内容的影响...... keypress() 显然没有问题。
var regex = new RegExp("^023-[0-9]{0,7}$");
$("#number").keyup(function(event) {
var number = $(this).val();
if(!regex.test(number)) {
event.preventDefault();
return false;
}
});
上面的代码不起作用。似乎 keypress() 使我能够停止他们键入的内容,但 keyup 使我能够获取当前值。我需要一个两者兼得的解决方案;)
问题实际上源于浏览器没有 MVC 架构这一事实。模型就是视图。不幸的是,我们无法在视图更新之前验证更新的模型......因为我们需要在 keyup 事件期间更新视图以获取更新的模型数据......到那时,阻止它们更新已经为时已晚查看,因为它已经更新了。
【问题讨论】:
-
您应该考虑对模糊进行验证。每次击键都针对正则表达式运行并不是提高性能的最佳主意。
-
@jbabey:不过,我总是必须将 023- 保留在现场。要求规定用户永远不能改变这一点。
-
那么 023- 应该在框旁边的标签(或只读输入)中,而不是在同一个框中。
-
@jbabey:要求说它必须在同一个盒子里。
-
那么我会推迟要求;)
标签: javascript jquery regex validation input