bet*_*max 97 html javascript regex ajax jquery
我在表单上写的验证有一个奇怪的问题.它是输入旁边的"检查用户名"按钮.输入默认值是用户名,例如'betamax'.当我按下"检查用户名"时,它会传递正则表达式并将用户名发送到服务器.服务器按预期运行并返回"2"以告诉javascript他们正在提交自己的用户名.
然后,当我再次单击该按钮时,正则表达式失败.由于正则表达式失败,显然没有任何内容发送到服务器.如果我再次按下该按钮,正则表达式将通过,然后将用户名发送到服务器.
我真的无法弄清楚它会做什么呢!对我来说完全是无稽之谈!
编辑:我在Firefox和Chrome(mac)中测试了这个问题
这是我的代码:
$j("#username-search").click(checkUserName);
function checkUserName() {
var userName = $j("#username").val();
var invalidUserMsg = 'Invalid username (a-zA-Z0-9 _ - and not - or _ at beginning or end of string)';
var filter = /^[^-_]([a-z0-9-_]{4,20})[^-_]$/gi;
if (filter.test(userName)) {
console.log("Pass")
$j.post(
"/account/profile/username_check/",
{ q: userName },
function(data){
if(data == 0) {
$j("#username-search-results").html("Error searching for username. Try again?");
}
else if(data == 5) {
$j("#username-search-results").html(invalidUserMsg);
}
else if(data == 4) {
$j("#username-search-results").html("Username too short or too long.");
}
else if(data == 2) {
$j("#username-search-results").html("This is already your username.");
}
else if(data == 3) {
$j("#username-search-results").html("This username is taken.");
}
else if(data == 1){
$j("#username-search-results").html("This username is available!");
}
});
} else {
console.log("fail")
$j("#username-search-results").html(invalidUserMsg);
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
HTML:
<input name="username" id="username" value="{{ user.username }}" />
<input type="button" value="Is it taken?" id="username-search">
<span id="username-search-results"></span>
Run Code Online (Sandbox Code Playgroud)
bob*_*nce 187
/^[^-_]([a-z0-9-_]{4,20})[^-_]$/gi;
Run Code Online (Sandbox Code Playgroud)
你正在使用g
(全局)RegExp
.在JavaScript中,全球使用regexen有状态:你叫他们(与exec
,test
等)在第一时间,你得到的第一个匹配给定的字符串中.再次调用它们,然后你得到下一个匹配,依此类推,直到你得不到匹配,并重置为下一个字符串的开头.您也可以写入regex.lastIndex= 0
以重置此状态.
(这当然是一个绝对可怕的设计,保证混淆并导致奇怪的错误.欢迎使用JavaScript!)
你可以省略g
你的RegExp
,因为你只测试一场比赛.
另外,我不认为你想要[^-_]
正面和背面.这将允许每一端的任何角色,即.*plop!
是有效的.您可能正在考虑前瞻/后瞻断言,但它们在JavaScript中不可用.(好吧,前瞻应该是,但它在IE中被破坏了.)建议:
/^[a-z0-9][a-z0-9_-]{2,18}[a-z0-9]$/i
Run Code Online (Sandbox Code Playgroud)