jQuery dynamic field classes not being assigned as desired.
Posted
by Simon
on Stack Overflow
See other posts from Stack Overflow
or by Simon
Published on 2010-04-15T22:46:53Z
Indexed on
2010/04/15
22:53 UTC
Read the original article
Hit count: 436
Hello,
I'm working on a fancy login page with 4 unique states attributed through classes for each field (normal, focus, active-on, active-off).
Normal is the default style. Focus is the focus style when nothing is typed. Active-on is the focus style when something has been typed. Active-off is for field that have user text in them, but are not focused right now.
Here's a demo to help you understand what I'm doing: http://www.controlstack.com/login
My JS is working almost correctly (thanks to some folks on this site), except in 2 cases:
If I enter something in the username field, then tab over to the password field, it does not add the ".focus" class to the password field.
If I blur out of the username field, then focus back on it, enter a few characters, then delete them, it does not add the ".focus" field.
Here's my code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" dir="ltr">
<head>
<title>Login</title>
<style>
input.field {height: 39px; width: 194px; background: url(login-fields.png) no-repeat; overflow: hidden; border: none; outline: none; float: left; margin-right: 7px;}
input.field#username {padding: 0 12px;}
input.field#username.focus {background-position: 0 -39px;}
input.field#username.active-on {background-position: 0 -78px;}
input.field#username.active-off {background-position: 0 -117px;}
input.field#password {background-position: -218px 0; padding: 0 12px;}
input.field#password.focus {background-position: -218px -39px;}
input.field#password.active-on {background-position: -218px -78px;}
input.field#password.active-off {background-position: -218px -117px;}
input.field#go {background-position: -436px 0; width: 88px; margin: 0; cursor: pointer;}
</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
loginField = $('.field');
firstField = $('.field.first');
firstField.focus();
loginField.focus(function(){
loginVal1 = loginField.val();
if (!loginVal1){
$(this).removeClass('active-off').addClass('focus');
}
else {
$(this).removeClass('active-off').addClass('active-on');
}
});
loginField.live('keydown', function(){
$(this).addClass('active-on').removeClass('active-off');
}).live('keyup', function(){
$(this).toggleClass('active-on', $(this).val() != '');
})
loginField.blur(function(){
loginVal2 = loginField.val();
if (!loginVal2){
$(this).removeClass('focus').removeClass('active-on');
$(this).val('');
}
else {
$(this).removeClass('focus').removeClass('active-on').addClass('active-off');
}
});
});
</script>
</head>
<body>
<h1>Login to your account</h1>
<form method="post" action="/">
<fieldset>
<input type="text" class="field first focus" id="username" />
<input type="text" class="field" id="password" />
<input type="submit" value="" class="field" id="go" alt="login" title="login" />
</fieldset>
</form>
</body>
</html>
Your help is much appreciated!
© Stack Overflow or respective owner