HTML5 的 PLACEHOLDER 属性

本文转载自: http://www.oschina.net/question/5189_22929

HTML5对Web Form做了许多增强,比如input新增的type类型、Form Validation等。Placeholder是HTML5新增的另一个属性,当input或者textarea设置了该属性后,该值的内容将作为灰字提示显示在文本框中,当文本框获得焦点时,提示文字消失。以前要实现这效果都是用JavaScript来控制才能实现:

<input  type="text" placeholder="请输入文字" />

由于placeholder是个新增属性,目前只有少数浏览器支持,如何检测浏览器是否支持它呢?(更多HTML5/CSS3特性检测可以访问)

function hasPlaceholderSupport() {
  return 'placeholder' in document.createElement('input');
}

默认提示文字是灰色的,可以通过CSS来改变文字样式:

/* all */
::-webkit-input-placeholder { color:#f00; }
input:-moz-placeholder { color:#f00; }
 
/* individual: webkit */
#field2::-webkit-input-placeholder { color:#00f; }
#field3::-webkit-input-placeholder { color:#090; background:lightgreen; text-transform:uppercase; }
#field4::-webkit-input-placeholder { font-style:italic; text-decoration:overline; letter-spacing:3px; color:#999; }
 
/* individual: mozilla */
#field2:-moz-placeholder { color:#00f; }
#field3:-moz-placeholder { color:#090; background:lightgreen; text-transform:uppercase; }
#field4:-moz-placeholder { font-style:italic; text-decoration:overline; letter-spacing:3px; color:#999; }

兼容其他不支持placeholder的浏览器:

var PlaceHolder = {
    _support: (function() {
        return 'placeholder' in document.createElement('input');
    })(),
 
    //提示文字的样式,需要在页面中其他位置定义
    className: 'abc',
 
    init: function() {
        if (!PlaceHolder._support) {
            //未对textarea处理,需要的自己加上
            var inputs = document.getElementsByTagName('input');
            PlaceHolder.create(inputs);
        }
    },
 
    create: function(inputs) {
        var input;
        if (!inputs.length) {
            inputs = [inputs];
        }
        for (var i = 0, length = inputs.length; i <length; i++) {
            input = inputs[i];
            if (!PlaceHolder._support && input.attributes && input.attributes.placeholder) {
                PlaceHolder._setValue(input);
                input.addEventListener('focus', function(e) {
                    if (this.value === this.attributes.placeholder.nodeValue) {
                        this.value = '';
                        this.className = '';
                    }
                }, false);
                input.addEventListener('blur', function(e) {
                    if (this.value === '') {
                        PlaceHolder._setValue(this);
                    }
                }, false);
            }
        }
    },
 
    _setValue: function(input) {
        input.value = input.attributes.placeholder.nodeValue;
        input.className = PlaceHolder.className;
    }
};
 
//页面初始化时对所有input做初始化
//PlaceHolder.init();
//或者单独设置某个元素
//PlaceHolder.create(document.getElementById('t1'));

另一份兼容代码:

/** placeholder 插件 **/
    /*initPlaceHolders pluggin: cross-browser support for the HTML5 placeholder attribute on input fields
    http://www.hagenburger.net/BLOG/HTML5-Input-Placeholder-Fix-With-jQuery.html
    usage: $('[placeholder]').initPlaceHolders()    //enable for all elements with the attribute placeholder*/
    (function($) {
        //feature detection
        var hasHtml5Support = ('placeholder' in (document.createElement('input')));
        var beforeFormSave = function () {
                    $(this).find('[placeholder]').each(function() {
                        var input = $(this);
                        if (input.val() == input.attr('placeholder')) {
                          input.val('');
                        }
                        input.removeClass('placeholder');
                      });
                };
        var defaults = {
                saveContainer: 'form',
                saveEvent: 'submit'
            };
        var methods = {
            init: function(options) {
                var settings = $.extend({},defaults,options);
                
                if(hasHtml5Support) {
                    return this;
                }
                this.live('focus',function() {
                  var input = $(this);
                  if (input.val() == input.attr('placeholder')) {
                    input.val('');
                    input.removeClass('placeholder');
                  }
                }).live('blur',function() {
                  var input = $(this);
                  if (input.val() == '' || input.val() == input.attr('placeholder')) {
                    input.addClass('placeholder');
                    input.val(input.attr('placeholder'));
                  }
                }).blur()
                .parents(settings.saveContainer).bind(settings.saveEvent, beforeFormSave);
                return this;
            },
            getValue: function() {
                if(hasHtml5Support) {
                    return this.val();
                }
                if(this.val()==this.attr('placeholder')) {
                    return '';
                }
                return this.val();
            },
            refresh: function() {
                if(hasHtml5Support){
                    return this;
                }
                return this.each(function(){
                    $(this).trigger('blur');
                });
            }
        };
        $.fn.initPlaceHolders = function(method) {
            if( methods[method] ) {
                return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
            } else if ( typeof method === 'object' || ! method ) {
                return methods.init.apply( this, arguments );
            } else {
                $.error( 'Method ' +  method + ' does not exist on jQuery.initPlaceHolders' );
            }
        };
    })(jQuery);

/* 使用 */
$('#searchKey').initPlaceHolders();