Hy all,

I have the following script, works perfectly in Firefox 2/3, but I’m
having a problem with IE7 on WinXP. The text in the label tags remains
visible next to each form field, and the labels within the form fields
don’t appear at first — they show up only after tabbing through them
(or adding, then removing input).

-------------------------------------------------------------------------------------

var stereolabels = Class.create();

stereolabels.prototype = {
  labels: [],

  initialize: function(options) {
    this.options = Object.extend({
                        className : 'inside'
                }, options || {});

    this.labels = $$('label.'+this.options.className);
    $A(this.labels).each(function(label) {
      this.initLabel(label);
    }.bind(this));

    $A(document.forms).each(function(form) {
      Event.observe(form, "submit", function() { this.uninit() }.bind
(this))
    }.bind(this));
  },

  // called on form submit
  // - clear all labels so they don't accidentally get submitted to
the server
  // - WOULD CAUSE BUG IF FIELD CONTENTS WAS IN FACT MEANT TO EQUAL
LABEL VALUE
  uninit: function() {
    $A(this.labels).each(function(label) {
      var el = $(label.htmlFor);
      if (el && el.value == el._labeltext) this.hide(el)
    }.bind(this));
  },

  // initialize a single label.
  // - only applicable to textarea and input[text] and input[password]
  // - arrange for label_focused and label_blurred to be called for
focus and blur
  // - show the initial label
  // - for other element types, show the default label
  initLabel: function(label) {
        try {
                var input     = $(label.htmlFor);
                var inputTag  = input.tagName.toLowerCase();
                var inputType = input.type;
                if (inputTag == "textarea" || (inputType == "text" || inputType 
==
"password")) {
                  Element.setStyle(label, { position: 'absolute', visibility:
'hidden'});
                        Object.extend(input, {
                    _labeltext: label.childNodes[0].nodeValue,
                    _type: inputType
                  });
                        Event.observe(input, 'focus', this.focused.bind(this));
                        Event.observe(input, 'blur', this.blurred.bind(this));
                        this.blurred({target:input});
                } else {
                  Element.setStyle(label, { position: 'static', visibility:
'visible' });
                }
        }
        catch (e) {
          Element.setStyle(label, { position: 'static', visibility:
'visible' });
        }
  },

  focused: function(e) {
        var el = Event.element(e);
        if (el.value == el._labeltext) el = this.hide(el)
        el.select();
  },

  blurred: function(e) {
    var el = Event.element(e);
        if (el.value == "") el = this.show(el);
  },

  hide: function(el) {
        if (el._type == "password") el = this.setInputType(el, "password");
        el.value = "";
          Element.removeClassName(el, this.options.className);
        return el;
  },

  show: function(el) {
        if (el._type == "password") el = this.setInputType(el, "text");
        Element.addClassName(el, this.options.className);
        el.value = el._labeltext;
        return el;
  },

  setInputType: function (el, type) {
    try {
      el.type = type;
      return el;
    }
    catch (e) { //IE can't set the type parameter
      var newEl = document.createElement("input");
      newEl.type = type;
                for (prop in el) {
                        try {
                          // crazy bug that still exists in ie 7 with width and 
heights,
use class name if necessary instead!
                                if (prop != "type" && prop != "height" && prop 
!= "width") {
                                  newEl[prop] = el[prop];
                                }
                        }
                        catch(e) { }
                }
                Event.observe(newEl, 'focus', this.focused.bind(this));
                        Event.observe(newEl, 'blur', this.blurred.bind(this));
                el.parentNode.replaceChild(newEl, el);
                return newEl;
    }
  }
}

Event.observe(window, 'load', stereolabelsInit, false);

var myLabels = null;
function stereolabelsInit() {
        myLabels = new stereolabels();
}

--------------------------------------------------------------------------------------------------------

The script uses Prototype framework. After some tests, ive discovered
that with Prototype 1.5 works great on all browsers, but with
Prototype 1.6.0.3 doesnt work on IE. Can anyone help me with this ? :(

I forgot to tell you what this scripts for :)

Stereolabels: Form labels inside inputs with Prototype

stereolabels crawls the DOM for labels with the specified class name
(default is ‘inside’) and places the label text inside the input
field, and adds the class name to the input element. Upon clicking the
field, the label is removed and the class name is removed from the
input element. If the field is left blank when it loses focus, the
label returns. This behavior is only applied to text, textarea, and
password input fields.

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Prototype & script.aculo.us" group.
To post to this group, send email to prototype-scriptaculous@googlegroups.com
To unsubscribe from this group, send email to 
prototype-scriptaculous+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to