バリデーションをプラグインを使わずに実装する
フォームは主にコンバージョンに直結する場合が多いと思いますので、
どのような機能を持って使いやすくするのか、
前回は、
入力された文字列をチェックする
文字列チェックのパターン
まずは文字列チェックのパターンをリストに挙げてみましょう。
- 必須チェック
(空文字) - メールアドレス
- 数字のみ
- アルファベットのみ
- 電話番号
- URL
基本的な項目としてはこんな所でしょうか。
チェックの方法
例えば、
- 1文字でも文字列が存在するか
- 半角スペース・
全角スペース・ 改行・ タブだけで入力されていないか
以上2つの手順を踏むことで、
1)1文字でも文字列が存在するか、をチェックする
1.の1文字でも存在するかのチェックは、
テキストフィールドの文字列はvalメソッドで取得します。
var txt = $('input').val();
console.log(txt);

文字列が存在するかのチェックは、
var txtLength = txt.length;
console.log(txtLength);

これで文字数が取得できました。さらに、
if(txt && txtLength>0){
console.log(txtLength); // ここで実行する
}else{
// ない場合は何もしない
}
2)半角スペース・全角スペース・改行・タブだけで入力されていないかのチェック
この4つのチェックには正規表現というものを使います。正規表現は文字列のパターンマッチングに使われるもので、
if(txt.match(/^[ \r\n\t]+$/)){
console.log('err');
return false;
}
正規表現
文字列に含まれている文字やパターンなどを判定するのが正規表現です。例えば、
\d
// または
0-9
というように書くことで1文字の数字を判定できます。つまり\dは0~9のうちのいずれかということになります。
またアルファベットと数字、
\w
// または
a-zA-Z0-9_
となります。
パターンも判定できるので、
^[^@ \t\n\r]+@[\w\-\.]+\.[\w\-\.]+$
というような正規表現で行います
正規表現によるマッチング
正規表現を用いたパターンマッチングを行うには、
strings.match(/正規表現/)
連載中で使用するマッチングの表現
まずは連載で使用するマッチングの表現を挙げておきます。これらはメタ文字、
メタ文字
正規表現で使われる独特の意味を持つ文字。
メタ文字 | 説明 |
---|---|
[012] | 0,1,2のいずれか |
[^012] | 0,1,2のいずれでもない |
^012 | 012で始まる |
012$ | 012で終わる |
a? | 0または1文字のa |
a* | 0文字以上のa |
a+ | 1文字以上のa |
. | 任意の1文字 |
定義済み文字クラス
それ単体で数字やアルファベットをまとめて表すことができる文字・
定義済み文字クラス | 説明 |
---|---|
\dまたは 0-9 | 0-9の半角数字 |
a-zA-Z | 半角英数字 |
\r\n | 改行 ラウザによってまちまちなので両方を指定 |
\t | タブ |
エスケープ
上記のメタ文字で定義されている文字列を文字として扱いたい場合や定義済み文字クラスを使う場合は、
簡単に言うと、
\*
\d
// など
エスケープ文字はフォントによって、
WindowsではBackSpace左の円マークキー、
使用例:簡易メールアドレスチェック
メールアドレスとして明らかに間違っているものをチェックします。
メールアドレスの形式は通常
[email protected]
のようになっています。今回は簡易チェック
^[^@ \t\n\r]+@[\w\-]+\.[\w\-\.]+$
この正規表現を文章にすると
「@半角スペース全角スペースタブ改行を含まない文字列1文字以上、
ということになります。まだ少しわかりにくいかもしれません。
ひとつひとつ分けてみましょう。上記のパターンは10の文字列・
パターン | 説明 |
---|---|
^ | ~で始まる |
[^@ \t\n\r] | @, 半角スペース, 全角スペース, タブ, 改行 文字以外 |
[^@ \t\n\r]+ | 直前の文字 |
@ | @1文字 |
[\w\-] | 半角数字, 半角アルファベット, アンダースコア, ハイフンのいずれか |
[\w\-]+ | 直前の文字 |
\. | 半角ドット1文字 |
[\w\-\.]+$ | 半角数字, 半角アルファベット, 半角アンダースコア, 半角ハイフン, 半角ドットのいずれか |
[\w\-\.]+$ | 直前の文字 |
(最初から) |
~で終わる |
Emailバリデーションを実装してみる
それでは、
その前に今回が初出のメソッドを紹介しておきます。
bindメソッド
第2引数で指定した関数を第1引数で指定したリスナーをトリガーに実行するように対象要素にbindします。
少し理解しにくいかもしれませんが、
$(elm).click(function(){
console.log('event happened');
}).blur(function(){
console.log('event happened');
});
などのようにclickとblurで同じ関数を実行するような場合は
$(elm).bind('click blur',function(){
console.log('event happened');
});
のようにまとめることが出来ます。なお複数指定する場合は、
removeメソッド
対象の要素をjQueryオブジェクトから削除します。
$(elm).remove();
endメソッド
nextメソッドやprevメソッドで行った移動をひとつ上位の要素に戻します。
$(elm).next().remove().end().click(function(){
console.log($(this));
});
要素の関連性も考えて以下のようにも書けます。
$(elm)
.next()
.remove()
.end()
.click(function(){
console.log($(this));
});
afterメソッド
対象の要素の後ろに要素などを追加したりできます。
$(elm).after('<span>after</span>');
Emailバリデーションの実装
Emailバリデーションの仕様としては、
jQuery(function($){
$('#email').bind('keyup blur',function(){
var txt = $(this).val();
var txtLength = txt.length;
if(txt && txtLength>0){
if(txt.match(/[^\@ \t\n\r]+\@[\w\-]+\.[\w\-\.]+$/)){
$(this).next().remove().end().after('<span class="ok">valid</span>');
}else{
$(this).next().remove().end().after('<span class="err">invalid</span>');
}
}else{
$(this).next().remove();
}
});
});
少し難しかったでしょうか。半分くらい正規表現でjQueryもあまり出てこなかったので面白くなかったかもしれません。次回は今回説明した内容をふまえてバリデーション関数を作ってみましょう。