如何防止用户在输入框中改变字符串,如果用最新的按键该输入的总价值不通过正则表达式?
我看到各种关于如何使用按键用于测试单个字符的例子,但我需要整个价值相匹配的正则表达式,而不仅仅是键按下它们。
例如,文本框需要顺应以下正则表达式:
"^023-[0-9]{0,7}$"
所以,如果他们想改变"023"
到"23"
,它应该停止他们时,他们删除0
字符。 这同样适用于删除真实-
后023
。 还应该阻止他们,一旦他们进入后超过7号023
。 这不能模糊完成。 它必须每次击键后进行。 性能是不是一个问题。
如果我使用按键()事件jQuery中,并得到这样的输入元素的值:
$(this).val()
然后,我将只能得到价值,他们按下键之前 - 而不是之后。 因此,有没有办法来测试对我的正则表达式的输入。 我不能简单地追加按下此字符串关键,因为我不能作一个假设,他们只是在字符串的最右侧进入键 。
我已研究过的keydown / KEYUP事件,虽然KEYUP似乎给我输入的电流值,用户按下一个键后,我发现很难去除的,他们键入的内容......该按键的作用()不会有一个问题,显然。
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;
}
});
上面的代码是行不通的。 看来按键()给我停下来,他们键入的内容的能力,但KEYUP让我得到的电流值的能力。 我需要一个解决方案,它都;)
真正的问题来自浏览器没有MVC架构的事实造成的。 该模型视图。 不幸的是,我们无法验证更新后的模型视图更新之前......因为我们需要一个keyup事件期间更新视图,以获取更新的模型数据......到那时候,为时已晚,以防止他们更新视图,因为它已经被更新。
这个怎么样:
var prevValue = "";
$("#number").keydown(function(e) {
prevValue = $(this).val();
});
$("#number").keyup(function(e) {
...
if(!regex.test(number))
$(this).val(prevValue);
// show error or other processing you need to do
});
尝试这个:
var pattern = new RegExp("^023-[0-9]{0,7}$");
$("#number").change(function(e){
if (!pattern.test($(this).val())) {
return false
}
})
该event
你有参数将包含你正在处理事件的所有细节。 这将包括被按下的键。
值得注意的是, keydown
和keyup
事件将返回按下的键,而keypress
返回输入的字符可能是您更好的选择。
:看到这里的帮助页面http://api.jquery.com/keypress/了解更多详情。
综上所述,虽然event.which
应该做你想要什么。 您可以结合起来,与文本框的初始值,并从获得新的价值。 如果不是有效的,则取消该事件,如果是有效的,那么让它去...
如果你可以使用jQuery验证插件,您可以创建自定义验证器来匹配您的正则表达式。 然后,所有你需要做的就是映射验证该输入。 你仍然需要验证在服务器端,但你可能已经这样做。
要做到你想要什么,在jQuery的插入符插件是必需的。 请注意,您需要从文件的开头删除评论(或至少将它们移动)或字节顺序标记的代码的开始会导致错误 。
所以,你需要做的是捕捉按键,在字符串在正确的位置插入字符,检查是否新的字符串是有效的,然后要么显示新插入或没有。 我认为有以下做你需要的东西:
$(document).ready(function(){
var regex = new RegExp("^023-[0-9]{0,7}$");
var caretpos;
$('#number').keypress(function(event){
// get the caret position
caretpos = $(this).caret().start;
//split the current value according to where the caret is
valuestart = $(this).val().substring(0,caretpos);
valueend = $(this).val().substring(caretpos);
// insert the fired character into the string
valuetocheck = valuestart + String.fromCharCode(event.which) + valueend;
// check if the proposed new value passes the regex
if (!regex.test(valuetocheck)) {
// failed, prevent the character being shown
event.preventDefault();
}
});
});
我在FF,Chrome浏览器,Safari浏览器,Opera和IE9的最新版本测试了这个。 在FF和Opera,光标按键被完全忽略,而他们移动插入符号像往常一样在其他浏览器,所以你可能要添加一些代码,以确保为一致的行为。 您可能还需要添加一些代码来处理会发生什么,如果用户选择了一些字符,而不是仅仅点击进入输入。 jQuery的插入符号插件必须在使用实例的选择。