Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
4
rated 0 times [  10] [ 6]  / answers: 1 / hits: 30757  / 14 Years ago, tue, april 13, 2010, 12:00:00

I have a strange problem with the validation I am writing on a form. It is a 'Check Username' button next to an input. The input default value is the username for example 'betamax'. When I press 'Check Username' it passes the regex and sends the username to the server. The server behaves as expected and returns '2' to tell the javascript that they are submitting their own username.



Then, when I click the button again, the regex fails. Nothing is sent to the server obviously because the regex has failed. If I press the button again, the regex passes and then the username is sent to the server.



I literally cannot figure out what would be making it do this! It makes no sense to me!



Edit: I've tested the problem in Firefox and Chrome (mac)



This is my code:



$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;

}


The 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>

More From » jquery

 Answers
1
/^[^-_]([a-z0-9-_]{4,20})[^-_]$/gi;


You're using a g (global) RegExp. In JavaScript, global regexen have state: you call them (with exec, test etc.) the first time, you get the first match in a given string. Call them again and you get the next match, and so on until you get no match and it resets to the start of the next string. You can also write regex.lastIndex= 0 to reset this state.



(This is of course an absolutely terrible piece of design, guaranteed to confuse and cause weird errors. Welcome to JavaScript!)



You can omit the g from your RegExp, since you're only testing for one match.



Also, I don't think you want [^-_] at the front and back. That will allow any character at each end, ie. *plop! would be valid. You're probably thinking of lookahead/lookbehind assertions, but they're not available in JavaScript. (Well, lookahead is supposed to be, but it's broken in IE.) Suggest instead:



/^[a-z0-9][a-z0-9_-]{2,18}[a-z0-9]$/i

[#97084] Sunday, April 11, 2010, 14 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
susand

Total Points: 690
Total Questions: 101
Total Answers: 104

Location: Lesotho
Member since Wed, Jun 2, 2021
3 Years ago
;