HOWTO: Automatically Clear/Restore Form Defaults w/jQuery

Profile picture

Just wanted to post this quick trick I've been using lately to automagically hide/show useful default text field values (e.g. "Search" in the search box) using jQuery and the ultra-handy Drupal.settings() object. Here's the short and sweet copy/pastable jQuery code:

 
$(document).ready(function(){   
  Drupal.settings.inputDefaults = {}   
  $("input:text").focus(function() {     
    var element = $(this);     
    Drupal.settings.inputDefaults[element.attr("id")] = element.val();     
    element.val('');   
  });   
  $("input:text").blur(function() {     
    var element = $(this);     
    if (element.val() == '') {
      element.val(Drupal.settings.inputDefaults[element.attr("id")]);
    }
  }); 
}); 

Basically this quick snippit will add a blank array object (ahh, the joys of moving between js and PHP) to the Drupal.settings object -- which is useful for all sorts of great javascript functionality, and is integral to Drupal 6.0's extended AHAH features; if you don't already know it, do your self a favor and study up -- and automatically fill it with any textarea's default values when a user clicks/tabs it into focus. This lets us clear the default value, but replace it quickly if the user moves on to another element.

As listed, you probably don't want this on your site, as it will affect things like editing nodes (e.g. title inputs will go blank when you click on them... not what you necessarily want), but it's easy to tune this to only hit elments within certain forms since every form in Drupal has a unique #id.

Thinking about this, I decided to tune it up and actually make an extended jQuery function for this so it could be more easily applied to speecific elements like so:

 
$(document).ready(function(){
   // handle hide/show for text field default values in only one form
   Drupal.settings.inputDefaults = {};
     $("#specific-form input:text").clearDefaultText();
   });
   jQuery.fn.clearDefaultText = function() {
     return this.each(function(){
       var element = $(this);
       Drupal.settings.inputDefaults[element.attr("id")] = element.val();
       element.focus(function() {
         if (element.val() == Drupal.settings.inputDefaults[element.attr("id")]) {
           element.val('');
         }
       });
     element.blur(function() {
       if (element.val() == '') {
         element.val(Drupal.settings.inputDefaults[element.attr("id")]);
       }
     });
   });
 } 

This is a pretty nice little plugin, I think, and it shows just how easy it can be to add nice/reusable UI functionality. Happy Drupaling, and go get 'em jQuery! (updated w/slight improvement to jQuery fn) (updated again w/object style improvements from comments)

Comments

Hi, thanks for the code. There was one problem, however. You use both 'input_defaults' and 'inputDefaults'. Thanks tho..really did help.

-Timothy

Fixed :)

Thanks, this is great. I could only get it to work for textboxes and not text areas, how would I fix this?

To get a text area to work, simply add ...

$("#specific-form textarea").clearDefaultText();

... right below ...
$("#specific-form input:text").clearDefaultText();

Enjoy,
Jason Bessonette

I cleaned your code up a bit for a strict use of jQuery. This is all you need. I appreciate the post!

$("input:text").focus(function() {
var element = $(this);
element.attr("rel",element.val());
element.val('');
});
$("input:text").blur(function() {
var element = $(this);
if (element.val() == '') {
element.val(element.attr("rel"));
}
});

Hi,

Quick question- 1) Why you have used "rel" attribute in an "input" tag in a form, is it valid?

2)I'm unable to restore default value using same code.

Thinking about this, I decided to tune it up and actually make an extended jQuery function for this so it could be more easily applied to speecific elements like so:

The code works like a charm. Thanks.

Mbt zapatosEnciendo el televisor escuchando el diálogo de los demásMbt zapatosTal vez los que me pueden dar cuenta de la historia
Usted tiene que amar no puedo aprenderMbt zapatosImpotente viendo que la situación empeore.Sentirse realmente en serio vistazo a la situación.Yo no puedo darte el futuro ustedMbt zapatosTranquilo final del tratamiento es otro.Cuando las lágrimas para permanecer.Shangyiqiaozai
La separación es otra de Mbt zapatosentender

Add comment

The content of this field is kept private and will not be shown publicly.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <br> <br/> <br /> <p> <img> <blockquote> <i> <b> <u>
  • Lines and paragraphs break automatically.
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
  • Web page addresses and e-mail addresses turn into links automatically.

More information about formatting options

By submitting this form, you accept the Mollom privacy policy.

Client Testimonial

We picked Chapter Three because of a track record of creating sites that work as good as they look, and an approach to open, collaborative web spaces that meshed with ours. I'll come back to them because they deliver what they promise, when they promise it. Chapter Three represents a group of creative, dedicated professionals who know how to think big and then make it happen.

Alex Halavais, Technical Director from DML Central, a project of the MacArthur Foundation

Drupalcon SF 2010