DEVELOPERS BLOGデベロッパーズブログ

  1. HOME > 
  2. 加藤 正人のデベロッパーズブログ > 
  3. JavaScript でバリデーション

加藤 正人のデベロッパーズブログ

加藤 正人

氏名
加藤 正人
役職
多分SE
血液型
秘密
出没
美味しいもののあるところ
特色
タヒチ大好き。ちょいメタボ。

加藤 正人

2013/03/09

JavaScript でバリデーション

 

前回作成したカウントダウンに続き、今回は JavaScript で入力欄の簡単なバリデーション機能を実装してみた。

この機能を利用することにより、フォーム送信前に個別にバリデーションを行うことが可能になる。従って、(入力項目が多いフォームの場合など) 使う場面によってはユーザビリティの向上が期待できる。

サンプルコードは以下の通り。

01// jQuery に自作バリデーション用メソッド validate を追加する
02$.fn.extend({
03    validate: function () { // jQuery に validate() メソッドを追加する
04        var ret = true;
05        var errors = false;
06        var rule = $(this).attr('data-validation-rule');
07        $(this).removeClass('form-error').removeAttr('title');
08        $(this).siblings('.error_msg').text('');
09        if ( rule )
10        {
11            // バリデーションルールがあった場合の処理
12            var allowEmpty = $(this).attr('data-validation-allow-empty');
13            var same_as = $(this).attr('data-validation-same-as');
14            var msg = $(this).attr('data-validation-error-message');
15            var set_error = function (jqobj, msg) {
16                jqobj.addClass('form-error').attr('title', msg);
17                if ( (err_msg=jqobj.siblings('.error-message')).length > 0 )
18                {
19                    err_msg.text(msg);  // error-message クラスのコンテナが存在していればそこにエラーメッセージを表示
20                }
21                else
22                {
23                    jqobj.after($('<div />').addClass('error-mesage').text(msg)); // 存在していない場合は当該コンテナ (jqobj) の後に追加して表示
24                }
25                return;
26            };
27            if ( rule == 'checked' )    // ルールが「checked」だった
28            {
29                if ( $(this).find('input:checked').length == 0 )    // 当該コンテナ配下に checked 要素が一つもない
30                {
31                    set_error($(this), msg);
32                    errors = true;
33                }
34            }
35            else if ( !($(this).attr('value').length == 0 && allowEmpty) )  // データが入力されている、または未入力で data-validation-allow-empty が設定されていない
36            {
37                var regex = new RegExp(rule.replace(/(^\/)|(\/$)/g, ''));
38                if ( !$(this).attr('value').match(regex) )  // 指定されていた正規表現と入力データが一致しなかった
39                {
40                    set_error($(this), msg);
41                    errors = true;
42                }
43            }
44            if ( !errors && same_as )   // ここまでエラーがなく、「same-as」が指定されていた
45            {
46                if ( $(this).attr('value') != $(same_as).attr('value') )    // 当該フィールドの値と same-as 指定されたフィールドの値が異なる
47                {
48                    set_error($(this), msg);
49                    errors = true;
50                }
51            }
52        }
53        return ret;
54    }
55});

バリデーション情報の渡し方は、data- で始まる属性をいくつかタグに付与することで行う。

data-validation-rule
バリデーションルールとして、正規表現または 'checked' を指定する。
data-validation-allow-empty
この属性が指定されている場合は空欄を許す。
data-validation-same-as
同じ値かどうかを比較する欄を特定するセレクタ文字列を指定する。email 欄と確認用 email 欄の比較などに利用する。
data-validation-error-message
バリデーションに失敗した場合のエラーメッセージ。

属性は1つずつしか指定できないので、複数のバリデーションルールやそれらに対し異なるエラーメッセージを与えることはできない点に注意。

下の実例では id="confirm" が指定されたオブジェクトをクリックするとフォーム内の対象を一度に処理しているが、blur() イベント処理を使えば入力欄からフォーカスが外れたら即バリデーションを行うような使い方も可能。

利用例はこちら。

01<script type="text/javascript" language="javascript">
02$(function () { // jQuery で確認ボタン処理
03    $('#confirm').click(function () {
04        $('div.form').find('input[type="text"], textarea, .validation').each(function () { $(this).validate(); return true; });
05    });
06});
07</script>
08 
09<div class="form">
10    <form action="#" method="post">
11        <table cellspacing="3" class="tb mBtm05" summary="フォーム">
12            <tbody>
13                <tr>
14                    <th>
15                        お名前</th>
16                    <td>
17                        <input class="text" data-validation-error-message="お名前が記入されていません。" data-validation-rule="/^.+$/" name="name" type="text" value="" /></td>
18                </tr>
19                <tr>
20                    <th>
21                        お名前フリガナ</th>
22                    <td>
23                        <input class="text" data-validation-error-message="お名前フリガナを全角カタカナでご記入ください。" data-validation-rule="/^[ァ-ンー ]+$/" name="yomi" type="text" value="" /></td>
24                </tr>
25                <tr>
26                    <th>
27                        メールアドレス</th>
28                    <td>
29                        <input class="text" data-validation-error-message="メールアドレスが記入されていないか、不正な形式です。" data-validation-rule="/^[\x01-\x7F]+@(([-a-zA-Z0-9]+\.)*[a-zA-Z]+|\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\])$/" name="email" type="text" value="" /></td>
30                </tr>
31                <tr>
32                    <th>
33                        メールアドレス<em class="em">確認用</em></th>
34                    <td>
35                        <input class="text" data-validation-error-message="確認用メールアドレスが記入されていないか、不正な形式です。" data-validation-rule="/^[\x01-\x7F]+@(([-a-zA-Z0-9]+\.)*[a-zA-Z]+|\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\])$/" data-validation-same-as="div.form form input[ data-cke-saved-name='email' name='email']" name="email-conf" type="text" value="" /></td>
36                </tr>
37                <tr>
38                    <th>
39                        性別</th>
40                    <td>
41                        <ul class="list validation" data-validation-error-message="性別が選択されていません。" data-validation-rule="checked">
42                            <li>
43                                <label><input id="gender_f" name="gender" type="radio" value="1" /> 女性</label></li>
44                            <li>
45                                <label><input id="gender_m" name="gender" type="radio" value="2" /> 男性</label></li>
46                        </ul>
47                    </td>
48                </tr>
49            </tbody>
50        </table>
51        <p class="font10 mBtm20">
52            <span class="validation" data-validation-error-message="同意欄がチェックされていません。" data-validation-rule="checked"><input name="" type="checkbox" value="" /> <a href="#">個人情報保護方針</a> に同意する。</span></p>
53        <div class="txtC mBtm50">
54            <input alt="上記内容で送信する" id="confirm" name="" src="/common/img/send_btn_01.jpg" type="image" value="" /></div>
55    </form>
56</div>

 

関連タグ: jQuery  JavaScript 

関連エントリー