このページの本文へ

前へ 1 2 3 次へ

  • twitterでつぶやく
  • はてなブックマークに登録
  • del.icio.usに登録
  • livedoorクリップに登録
  • Buzzurlに登録
  • StumbleUponに登録
  • Google Bookmarksに登録
  • Facebookでシェア
  • Yahoo!ブックマークに登録
  • お気に入りに登録
  • 本文印刷

Web制作の現場で使えるjQuery UIデザイン入門 ― 第22回

jQueryでバリデーション付きメールフォームを作ろう

2009年12月02日 13時00分更新

文● 西畑一馬/to-R


■ラジオボタンの必須チェック

 ラジオボタンのバリデーションは、class属性に「validate」と「required」の両方が設定されている要素を対象に実施します。同じname属性(ここでは「gender」)が設定されているラジオボタンのうち、チェックの入っているボタンが1つ以上存在するかを調べます。

 チェックの入っているボタンは、:checked(関連記事)セレクターで特定でき、セレクターに合致する要素の数はsize()を使って調べられます。size()で調べた結果、チェックの入っているボタンの数が0の場合に、エラーメッセージを表示します。


$(":radio").filter(".validate").each(function(){
    $(this).filter(".required").each(function(){
        if($(":radio[name="+$(this).attr("name")+"]:checked").size() == 0){
            $(this).parent().prepend("<p class='error'>選択してください</p>")
        }
    })
})


 ラジオボタンは、name属性が同じinput要素のいずれかにclass属性「validate」「required」が設定されていればチェックできます。


<input type="radio" value="男性" name="gender" id="man" class="validate required" /> <label for="man">男性</label>
<input type="radio" value="女性" name="gender" id="woman" /><label for="woman">女性</label>


■チェックボックスの必須チェック

 次は、チェックボックスのバリデーションです。チェックボックスはラジオボタンのようにグルーピングする機能がありませんので、親要素(dd要素)に「checkboxRequired」というclass属性を付け、その子要素のチェックボックスが選択されているか調べます。


<dd class="checkboxRequired">
    <input type="checkbox" name="search" id="search" value="検索エンジン" /> <label for="search">検索エンジン</label>
    <input type="checkbox" name="freiend" id="freiend" value="知人の紹介" /> <label for="freiend">知人の紹介</label>
    <input type="checkbox" name="mail_magazine" id="mail_magazine" value="メルマガ" /> <label for="mail_magazine">メルマガ</label>
    <input type="checkbox" name="etc" value="その他" id="etc" class="validate add_text" /> <label for="etc">その他</label>
</dd>


 class属性が「checkboxRequired」の要素の子要素にあるチェックボックスのsize()が0、つまり何もチェックが付いてない場合のみエラーを表示します。


$(".checkboxRequired").each(function(){
    if($(":checkbox:checked",this).size()==0){
        $(this).prepend("<p class='error'>選択してください</p>")
    }
})


■その他項目のチェック

 チェックボックスの「その他」にチェックが入っている場合には、その後ろの1行テキスト入力フォームにテキストが入力されているか調べます。

 「その他」のチェックボックスには「validate」と「add_text」のclass属性が設定されています。そこで、if文で $(セレクター).attr("checked")==true として「その他」にチェックが入っているかを調べます。replace()と正規表現を使って特定し、val()を使ってテキストが入力されているか調べます。

 まとめると、class属性が「validate」と「add_text」のチェックボックスにチェックが入っており、かつ、_textで終わるname属性のテキスト入力フォームが空の場合に、エラーメッセージを表示します。今回の場合は、「validate」と「add_text」が設定されているチェックボックスのname属性は「etc」ですので、name属性が「etc_text」の1行テキスト入力フォームが対象になります。


$(".validate.add_text").each(function(){
    if($(this).attr("checked")==true && $("input[name="+$(this).attr("name").replace(/^(.+)$/, "$1_text")+"]").val()==""){
        $(this).parent().prepend("<p class='error'>その他の項目を入力してください。</p>")
    }
})


■バリデーションエラー時の処理

 最後に、バリデーションエラーがあった際に実行する処理を設定します。エラーがあった場合、<p class='error'>エラー内容</p>というHTMLが追加されていますので、if文を使ってエラー内容が追加されているかチェックします。

 エラーがあった場合、animate()を使って、最初にエラーがあったフォーム項目にスクロールアニメーションで移動します。セレクターにhtml,bodyを指定して、animate()でscrollTopを変更すると、スクロールアニメーションによるページ内移動ができます。実際には、最初にエラーが出現した要素(p.error:first)よりも少し上を設定すると、項目名が確認できる位置に移動します。

 また、エラーが発生している要素の親要素にはaddClass()でclass属性「error」を追加します。最後にreturn false;を設定して、フォームの送信処理を中断します。


if($("p.error").size() > 0){
    $('html,body').animate({ scrollTop: $("p.error:first").offset().top-40 }, 'slow');
    $("p.error").parent().addClass("error");
    return false;
}


 以上でフォームバリデーションのスクリプトが完成しました。フォームバリデーションは厳格にやろうとすればするほど複雑なスクリプトになってしまいますし、あまり厳しくしすぎるとユーザーが途中で挫折して入力を断念してしまう可能性もあります。バリデーションはあくまでユーザビリティの向上を目的に作成しましょう。


著者:西畑一馬(にしはた かずま)

著者写真

to-R代表、Webクリエイター。PHPによるシステム開発や、CMSを利用したWebサイト制作、SEO対策などのマーケティング、コンサルティング、Webクリエイター向けの講座などを業務で行なっている。また、ブログto-RではJavaScriptやSEO対策、CSS、Movable TypeなどのWeb制作にかかわるさまざまな情報を発信している。
主な著書に「現場のプロから学ぶXHTML+CSS」(共著、毎日コミュニケーションズ刊)がある。

前へ 1 2 3 次へ

カテゴリートップへ

この連載の記事

ASCII.jp会員サービス 週刊Web Professional登録

Webディレクター江口明日香が行く

みんなが買ってる最新アイテムはコレだ!

Microsoft Windows 7 Home Premium 通常版 Service Pack 1 適用済み

iPhone 4S/4 防指紋性・高光沢機能性フィルム PRO GUARD AF for iPhone 4S/4 / PGAF-IPH4

iPhone 4S/4 防指紋性・高光沢機能性フィルム PRO GUARD AF for iPhone 4S/4 / PGAF-IPH4

マイクロソリューション Micro Solution Inc.

83人が購入

BenQ 24型 LCDワイドモニタ XL2420T

BenQ 24型 LCDワイドモニタ XL2420T

ベンキュージャパン

37,238円〜

3人が購入

jQuery Mobile スマートフォンサイト デザイン入門 (WEB PROFESSIONAL)

jQuery Mobile スマートフォンサイト デザイン入門 (WEB PROFESSIONAL)

アスキー・メディアワークス

2,499円〜

20人が購入

メモリーカード 32GB (PCH-Z321J)

メモリーカード 32GB (PCH-Z321J)

ソニー・コンピュータエンタテインメント

7,772円〜

6人が購入

Amazon.co.jp