HTML5 的 PLACEHOLDER 属性
本文转载自: http://www.oschina.net/question/5189_22929
HTML5对Web Form做了许多增强,比如input新增的type类型、Form Validation等。Placeholder是HTML5新增的另一个属性,当input或者textarea设置了该属性后,该值的内容将作为灰字提示显示在文本框中,当文本框获得焦点时,提示文字消失。以前要实现这效果都是用JavaScript来控制才能实现:
<input id="t1" 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();