Javascript的正则expression式返回true ..然后false ..然后true ..等
我在写一个表单的validation有一个奇怪的问题。 这是一个input旁边的“检查用户名”button。 input的默认值是用户名,例如'betamax'。 当我按'检查用户名'它传递正则expression式并发送用户名到服务器。 服务器的行为如预期,并返回“2”告诉JavaScript,他们正在提交自己的用户名。
然后,当我再次点击button,正则expression式失败。 显然,因为正则expression式失败,所以没有任何东西被发送到服务器。 如果我再次按下button,正则expression式通过,然后用户名被发送到服务器。
我从字面上不知道会做什么这样做! 对我来说完全是无稽之谈!
编辑:我已经testing了在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; }
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>
/^[^-_]([a-z0-9-_]{4,20})[^-_]$/gi;
您正在使用g
(全局) RegExp
。 在JavaScript中,全局正则expression式有一个状态:第一次调用它们(用exec
, test
等),你得到给定string中的第一个匹配项。 再次调用它们,你会得到下一个匹配,等等,直到你没有匹配,它重置到下一个string的开始。 你也可以写regex.lastIndex= 0
来重置这个状态。
(这当然是一个绝对可怕的devise,保证混淆并导致奇怪的错误。欢迎使用JavaScript!)
您可以从RegExp
省略g
,因为您只能testing一场比赛。
另外,我不认为你想在前面和后面[^-_]
。 这将允许在每一端的任何字符,即。 *plop!
将是有效的。 您可能正在考虑前瞻/ lookbehind断言,但它们在JavaScript中不可用。 (呃,应该是前瞻,但是在IE中被打破了。)build议改为:
/^[a-z0-9][a-z0-9_-]{2,18}[a-z0-9]$/i
[a-z0-9-_]
这是错误的,最后一个-
必须在开始或结束。
[a-z0-9_-]
不知道是否会造成这个问题,我不知道。
补充笔记:
第一个和最后一个字符可以是任何不是-
或_
而不是被限制在a-z0-9
字符
a-z0-9
不包含大写字母。 你需要a-zA-Z0-9
。 在大多数RegEx引擎中, a-zA-Z0-9_
可以缩短为\w
。 我没有在JavaScript中尝试过。
- 我怎么知道jQuery是否有一个Ajax请求挂起?
- HTML5是否允许Web应用程序build立点对点的HTTP连接?
- 如何与node.js一起使用jQuery ajax调用
- 在asp.net MVC中授权属性和jQuery AJAX
- 如何在Sonata Admin窗体中使用Ajax?
- Rails的accept_nested_attributes_for与f.fields_for和AJAX
- 如何在ASP.NET MVC / WebAPI应用程序中支持HTTP OPTIONS动词
- SCRIPT7002:XMLHttpRequest:networking错误0x2ef3,由于错误00002ef3,无法完成该操作
- 如何触发基于服务器响应的jquery.ajax()错误callback,而不是HTTP 500?