HTML5のplaceholder属性をjQueryでやってみる
Posted: Updated:
追記:HTML5のplaceholder属性を代替するjQueryプラグイン(ah-placeholder.js)
ここと同じ内容のことをjQueryプラグインの体裁に整えたものを,GitHubで公開してます.詳しくは上の記事をご参照のこと.
placeholder属性
HTML5のinput要素には、placeholder属性があります。input要素に、placeholder属性でテキストを書くと、下のような感じの表現が可能になります。今のところOpera・Safari・Chromeでは、ネイティブに記述しても解釈してくれるようです。
ただし、XHTML 1.1や、HTML 4.01のDTDを宣言した状態で、placeholder属性を書くと、ValidなHTMLにならないので注意が必要です。
で、代替になるスクリプトかいてみた
最近すこしずつJavascript、もといjQueryが書けるようになってきたので、代替スクリプトを書いてみました。上のサンプルもそのスクリプトで疑似再現しています。
classでjs-placeholderと付ければ動作します。title属性の中身を、placeholder属性として代用しています。
$('.js-placeholder').each(function ( )
{
(function ( elm )
{
// placeholder時の文字色を設定
var defaultColor = 'silver';
// title属性をplaceholder用の文字列として保持
$.data(elm, 'placeholder-string', $(elm).attr('title'));
// 元の文字色を保持 => 入力があったら戻します
$.data(elm, 'placeholder-color', $(elm).css('color'));
switch ( $(elm).val() ) {
case '' :
$(elm).val($.data(elm, 'placeholder-string'));
case $.data(elm, 'placeholder-string') :
$(elm).css('color', defaultColor);
break;
}
// フォーカスされたときに、placeholderを消して色を戻す
$(elm).focus(function ( )
{
if ( $(this).val() == $.data(this, 'placeholder-string') ) {
$(this).val('');
$(this).css('color', $.data(this, 'placeholder-color'));
}
});
// フォーカスが外れたときに、valueがカラならplaceholderを代入
$(elm).blur(function ( )
{
if ( $(this).val() == '' ) {
$(this).val($.data(this, 'placeholder-string'));
$(this).css('color', defaultColor);
}
});
// フォームのsubmit時に、placeholderのままなら消してから送る
$(elm).parents().filter('form').submit(function ( )
{
if ( $(elm).val() == $.data(elm, 'placeholder-string') ) {
$(elm).val('');
}
return true;
});
})( this )
});
依存関係は、jQuery1.2.6と1.4.2で、動作を確認しています。$.data()が便利でした。colorはともかく、title属性は普通に、$(elm).attr('title')で良いのですが発見を記念して$.data()を使ってみています。
placeholder - 結構便利で、好きな表現です
このplaceholderの表現が結構好きで、管理ページやフォームを作り込みたいときは、積極的に組み込んでいます。作る側の自己満足ですが、作り込んでる感が結構違いますしね。
入力例とかはplaceholderじゃなくて、普通にinput要素の外というか、横にでも書いたほうがいいんだろうなぁ、と思ったり。例は入力しながら見れないと意味ないですから。使いすぎは注意なのです。
そういえば学生の頃に、技能五輪に参加したときも、見よう見まねでplaceholder的な挙動のモノ作ったなー。JSもASも大分遠のいてましたが、JSのほうはこれから積極的に書いてみたいと思います。
HTML5のAPIとのカラミもあるので。とかいいつつ、たぶん次は、Twitterの@anywhere方面です。