Highlighting form fields with unobtrusive JavaScript

I wanted to alter the appearance of a form field when someone places their cursor in i, an effect that you see here and there.

My requirements for this were that I shouldn’t have to manually attach a Javascript event to every field and the code should be reusable on other sites without reconfiguration each time.

Using the principles of unobtrusive JavaScript I put together a short script, that when included on a page, will automatically add onFocus and onBlur handlers to all text and password fields on that page. When a field is activated it takes on the properties of a special CSS class. When it loses focus, it takes on the properties of another CSS class.

All you have to do to include this effect in your page is include the JavaScript file somewhere on the page and to add two CSS classes to your stylesheet. You decide how those CSS classes should make the form field look.

First, add the two CSS classes to your stylesheet and style them as you’d like. highlightActiveField is loaded when the field is activated. highlightInactiveField is loaded when the field loses focus.

.highlightActiveField {
    border: 1px solid black;
    border-left: 4px solid #BF1717;
    background-color: #DFDFDF;  
}

.highlightInactiveField {
    border: 1px solid black;    
    background-color: #fff;
}

Then add this JavaScript to the page somewhere — I created a file called highlightform.js and include it like this: <script type="text/javascript" src="highlightform.js"></script>

function initHighlight() {
    if (!document.getElementsByTagName){ return; }
    var allfields = document.getElementsByTagName("input");

    // loop through all input tags and add events
    for (var i=0; i<allfields.length; i++){
        var field = allfields[i];
        if ((field.getAttribute("type") == "text") || (field.getAttribute("type") == "password") ) {
            field.onfocus = function () {this.className = 'highlightActiveField';}
            field.onblur = function () {this.className = 'highlightInactiveField';}
        }
    }
}

// Nifty function to add onload events without overwriting
// ones already there courtesy of the lovely and talented
// Simon Willison http://simon.incutio.com/
function addLoadEvent(func) {   
    var oldonload = window.onload;
    if (typeof window.onload != 'function'){
        window.onload = func;
    } else {
        window.onload = function(){
        oldonload();
        func();
        }
    }
}

addLoadEvent(initHighlight);

Now step three… there is no step three! Just load your page and watch the magic.

Joseph Scott
July 19, 2006 9:19 PM

You can do this with plain CSS:

input:focus, textarea:focus { background-color: yellow; }

This works in Firefox, Opera and Safari. Of course IE doesn’t properly support :focus on form fields :-(

Adam Kalsey
July 19, 2006 10:16 PM

Yes, since IE doesn’t support the :hover pseudoclass on anything but links, it’s neccessary to use JavaScript.

Jemaleddin
July 20, 2006 7:57 AM

You can also use Peter Nederlof’s whatever:hover to add :hover, :focus and :active to IE:

http://www.xs4all.nl/~peterned/csshover.html

Philip Tellis
July 29, 2006 1:51 AM

Problems:

  • If the textbox already has a class, your method overwrites it.
  • If the textbox already has onblur/onfocus event handlers, your method overwrites those.

You know how to handle the latter. For the former, I’d suggest adding “highlightActiveField” to the className (.className += ” highlightActiveField”) onfocus and removing it onblur:.className = .className.replace(/ *highlightActiveField/g, ”);

Dave
August 10, 2006 6:08 AM

This is pretty sweet, thanks for sharing.

trovster
August 17, 2006 7:25 AM

I threw the following together. It relies on some other functions, such as addClass, removeClass and addEvent. But it works for all form elements, not limiting to type=”text” and type=”password”. The addEvent means events are not overwritten. And similarly addClass makes sure existing classes are not overwritten.

Also, you do not need a default unfocused class, as you can simply use the element itself.

input, textarea { border: 1px solid #ccc; } input.focused, textarea.focus_element { border-color: #000; }

var focusclass = ‘focuselement’; function formfocusfix() { if(!document.createElement || !document.getElementsByTagName || !document.getElementById) return false; var formcollection = document.getElementsByTagName(‘form’); var formcollectionlength = formcollection.length; for(i=0; i<formcollectionlength; i++) { for(j=0; j<formcollection[i].elements.length; j++) { addEvent(formcollection[i].elements[j],’focus’,function(){addClass(this,focusclass)}); addEvent(formcollection[i].elements[j],’blur’,function(){removeClass(this,focus_class)}) } } }

This discussion has been closed.

Follow me on Twitter

Lijit Search

Best Of

  • How not to apply for a job Applying for a job isn't that hard, but it does take some minimal effort and common sense.
  • Pitching Bloggers Forget what you learned in your PR classes. Start acting like a human instead of a marketer, and the humans behind the blogs will respond.
  • Where do the RSS ad startups fit in? Yahoo's RSS advertising service could spell trouble for pure-play RSS advertising services unless they adapt their business model.
  • The best of 2006 I wrote a lot of drivel in 2006. Here's the things that are less crappy than the rest.
  • Newly Digital Newly Digital is an experimental writing project. I've asked 11 people to write about their early experiences with computing technology and post their essays on their weblogs. So go read, enjoy, and then contribute. This collection is open to you. Write up your own story, and then let the world know about it.
  • More of the best »

Recently Read

Get More

Subscribe | Archives

Recently

Ideas, Risk, and Investors (Jan 1)
Over at SacStarts, I have piece up discussing a common question I get from entrepreneurs....
VoiceXML for web developers (Dec 17)
Building voice applications isn't hard at all. Any web developer can do it.
De-skunking a dog (Oct 27)
How to clean up your pet after a skunk attack.
Pressure sales via Twitter (Oct 16)
Sticking an ad in my face when we first meet is a good way to lose my interest.
Loma Prieta, 20 years later (Oct 13)
Looking at the earthquake from October 17, 1989
Red light cameras don't work (Oct 13)
Cameras installed to catch people running red lights aren't about traffic safety at all.
Jack-o-lantern pumpkin carving patterns (Oct 12)
It's a tradition, what can I say?
SEO realities (Oct 12)
The real search engine optimization. Works every time.

Subscribe to this site's feed.

Elsewhere

IMified
Build instant messaging applications. (My company)
SacStarts
The Sacramento technology startup community.
Pinewood Freak
Pinewood Derby tips and tricks

Contact

Adam Kalsey

Mobile: 916.600.2497

Email: adam AT kalsey.com

AIM or Skype: akalsey

Resume

PGP Key

©1999-2010 Adam Kalsey.
Content management by Movable Type.