フォームで利用するjQueryのスニペット
コードをいくつか。どれも既出だと思う
のでおさらいという事で。とはいえ、所詮
はスニペットですので実際に導入する際
は動作をしっかりと検証する事を強く
推奨します。
フォーム周りのjQueryスニペットです。自分用のメモも兼ねて。
フォーム関係は色々面倒なので参考にならない事もあるかと思います。「ふーん」程度にご覧頂くと丁度いいと思います。
Placeholder属性を、非対応ブラウザでは表示/非表示に
便利なHTML5のPlaceholder属性をオールドブラウザでは表示/非表示として対応します。
コード
if (!$.support.placeholder) { var active = document.activeElement; $( ':text' ).focus( function () { if ($( this ).attr( 'placeholder' ) != '' && $( this ).val() == $( this ).attr( 'placeholder' )) { $( this ).val( '' ).removeClass( 'hasPlaceholder' ); } }).blur( function () { if ($( this ).attr( 'placeholder' ) != '' && ($( this ).val() == '' || $( this ).val() == $( this ).attr( 'placeholder' ))) { $( this ).val($( this ).attr( 'placeholder' )).addClass( 'hasPlaceholder' ); } }); $( ':text' ).blur(); $(active).focus(); $( 'form' ).submit( function () { $( this ).find( '.hasPlaceholder' ).each( function () { $( this ).val( '' ); }); }); } |
サポートしてるブラウザと非サポートブラウザで分岐する
via:Cross-Browser Support for HTML5 Placeholder Text in Forms
input要素にフォーカスしたらデフォルトテキストを全選択
forcusfocusメソッドを利用しているケースも見かけますが、mouseupを使うと選択が外れにくいです
※スペル間違えてた
コード
$( '.allselect' ).live( 'mouseup' , function () { $( this ).select(); }); |
チェックボックスを全部選択する
よくあるやつ
コード
$( "#toggle" ).click( function (){ $( '.cbox' ).prop( 'checked' , $( this ).prop( 'checked' )); }); |
親をクリックすると子のinputが全部選択される。
フォーカスしたらアニメーションしながら伸びる検索窓
CSS3でたまに見かけるやつをオールドブラウザでも利用出来るようにする
コード
$( 'input' ).focus( function (){ t = $( this ); if (t.val()=== 'foo bar' ){t.val( '' ); }t.animate({width: '250px' },400); }); $( 'input' ).blur( function (){ t = $( this ); if (t.val()=== '' ){t.val( 'foo bar' ); }t.animate({width: '140px' },500); }); |
フォーカス時と外れたときにアニメーションエフェクト付きで長さを変えます。
入力すると自動で高さが変わるtextarea
もうちょい工夫しないとですけど。
コード
$.fn.textarea = function (){ function init(){ var d = $( this ).wrap( '<div></div>' ); var p = $( '<pre></pre>' ).html(d.val()).insertAfter(d); d.bind( 'keyup change click focus' , function (e){ p.html(d.val()); }); } return this .each(init); }; $( 'textarea' ).textarea(); |
上記コードはプラグインになってます。
チェックボックスやラジオボタンの選択項目をハイライトする
項目数が多い場合に施工してあげると親切かも。
コード
$( ":checked" ).parent().css( "background" , "#f3f365" ); $( "input" ).click( function (e) { var t = e.target.type; var chk = $( this ).prop( 'checked' ); var name = $( this ).attr( 'name' ); if (t === 'checkbox' ) { if (chk === true ){ $( this ).parent().css( 'background' , '#f3f365' ); } else { $( this ).parent().css( 'background-color' , '' ); } return true ; } else if (t === 'radio' ) { if (chk === true ){ $( "input[name=" + name + "]" ).parent().css( "background-color" , "" ); $( this ).parent().css( "background" , "#f3f365" ); } return true ; } }); |
選択してある要素の親に背景色を変えるcssが加わるようにします。
パスワードの表示/非表示をスイッチできるようにする
「ユーザーが選択出来るようにする」は基本的に親切な配慮です。
コード
function changeInputType(inputId, type) { var input = $( "#" + inputId); $(input).replaceWith($( "<input />" ).val(input.val()).attr( "placeholder" , input.attr( "placeholder" )).attr( "id" , inputId).attr( "type" , type)); } $( "#show-ps" ).change( function () { if ($( this ).attr( "checked" )) { changeInputType( "password" , "text" ); } else { changeInputType( "password" , "password" ); } }); if ($( "#show-ps" ).attr( "checked" )) { changeInputType( "password" , "text" ); } |
inputのタイプを、チェックボックスにチェックが入ったらpasswordからtextに変更すれば入力した内容を表示させる事ができます。
via:jsbin
「利用規約に同意して送信する」的なものを作る
チェックを入れないと送信できない。必要かどうか分からないけどよくあるので。
コード
$( '#submit' ).attr( "disabled" , "disabled" ); $( '#check' ).click( function (){ if ($( this ).prop( 'checked' ) == false ){ $( '#submit' ).attr( "disabled" , "disabled" ); } else { $( '#submit' ).removeAttr( 'disabled' ); } }); |
チェックボックスがfalseの時はsubmitがdisabledになるようにする。
via:How do i disable a submit button when checkbox is uncheck?
チェックボックスのチェック項目数を制限する
「~個以上はチェックしないで下さい」ってユーザーに頼むんじゃなくて、こっちでそういう仕様にしてあげたほうが良いです。
コード
$( "input" ).click( function (){ var $count = $( "input:checked" ).length; var $not = $( 'input' ).not( ':checked' ); if ($count >= 3) { $not.attr( "disabled" , true ); } else { $not.attr( "disabled" , false ); } }); |
lengthでチェックされた数を取得して、数で条件分岐します。
inputにフォーカス中はツールチップでヘルプを出す
あんまりやりすぎると鬱陶しいかもですけど。
コード
$( "p" ).hide(); $( "input" ).focus( function () { $( "p" ).fadeToggle( "fast" , "linear" ); }); $( "input" ).focusout( function () { $( "p" ).fadeToggle( "fast" , "linear" ); }); |
フォーカス時に、hideさせてたp要素をフェードエフェクトで表示させます。
親のinputにチェックを入れると子は全部disableになるようにする
あんまり使わないかもですけど・・
コード
$( "#piyo" ).click( function () { $( ".list" ).each( function () { this .disabled = ! this .disabled; }); }); |
ラジオボタンの選択に応じて表示コンテンツを切り替える
こういうのもあると便利。選択項目の詳細を表示したい時でも、結構スペースを確保できます。
コード
$( "input" ).click( function (){ $( '.box' ).hide(); $( "#box-" +$( this ).val()).fadeIn( 'first' ); }); |
IDにあわせて表示。
テーブルの行ごとチェックボックスにする
チェック項目の内容、情報量が多い時はテーブルでグルーピングして丸ごとチェックボックス化
コード
$( 'input[type=checkbox]' ).click( function () { var t = $( this ); if (t.prop( 'checked' )){ t.prop( 'checked' , '' ); } else { t.prop( 'checked' , 'checked' );} }); $( 'table tr' ).click( function () { var $c = $( this ).children( 'td' ).children( 'input[type=checkbox]' ); if ($c.prop( 'checked' )){ $c.prop( 'checked' , '' ); } else { $c.prop( 'checked' , 'checked' );} }); |
trをクリックするとtd内のinput要素にチェックが付く
【追記】
コメントでご指摘を受けて修正しました
以上です
動作は一応するけど、コピペで使うと多分痛い目見ます。
今になって気が付いたけど「利用規約に同意して送信する」って別にユーザビリティじゃないですね。