堀北真希うさぎ
主な作品
制作者のオリジナルキャラクタのイラスト例とそれを組み込んだアニメーション動画

ページ案内

数字入力を確認するスクリプト。

数字を入力すべきフォームに正しく数字が入力されたかどうかを確認し、正しくなければエラーとするスクリプトです。

応用次第では、数字以外の文字列入力についても同様のスクリプトが書けるようになるでしょう。

数字入力を確認するスクリプト・目次。

おことわり。

このスクリプトは欧米語の環境ならそんなに難しくは無いのですが、日本語環境を想定した場合は全角文字対策を入れる事が望ましいでしょう。

そして、全角文字はJISコード(ISO-2022-JP), シフトJISコード, EUC日本語コード及びUTF-8コードで異なります。

ここでは、シフトJISコード環境でのフォームとさせていただきます。

数字入力を確認するスクリプトのサンプル。

以下のフォームは、八桁の会員番号入力が必須となっております。

スクリプトを実行できる環境なら、八桁の数字を入力せずに送信ボタンを押すと、エラーダイアログが開く筈です。

認証入力
会員番号(八桁)

数字入力を確認するスクリプトのソースとHTML文書での記述。

数字入力を確認するスクリプト「CheckNumberEnter.js」は以下のようになっております。

s_allowed='0123456789';            //    半角数字(ここに入っていない文字があったらエラー)。
s_allowed_zen='0123456789';    //    全角数字(上の文字列と対応するように並べる事)。
s_error='数字以外は入力出来ません!';    //    不正文字のエラーメッセージ。

function CheckNumberEnter() {
    s_len=0;
    i=document.forms[0].number.value;
    j='';

    //    全角文字を一文字と認識する環境。
    if ('あ'.length==1) {
        while (i!='') {
            k=i.substring(0,1);
            i=i.substring(1,i.length);
            //    全角数字なら半角に変換する。
            m=s_allowed_zen.indexOf(k); if (m>-1) k=s_allowed.substring(m,m+1);
            //    正しい数字か?
            if (s_allowed.indexOf(k)<0) { window.alert(s_error); return(false); }
            j+=k; ++s_len;
            }
        }
    //    全角文字を一文字と認識しない環境。
    else {
        while (i!='') {
            k=i.substring(0,1);
            i=i.substring(1,i.length);
            //    半角数字なら問題無い。
            if (s_allowed.indexOf(k)>-1) { j+=k; ++s_len; continue; }
            //    全角数字か調べ、そうなら半角に変換する。
            //    文字が残っていなければエラー。
            if (i=='') { window.alert(s_error); return(false); }
            //    もう一文字取り出す。
            k+=i.substring(0,1);
            i=i.substring(1,i.length);
            m=s_allowed_zen.indexOf(k);
            //    変換出来なかったらエラー。
            if (m<0 || (m & 1)!=0) { window.alert(s_error); return(false); }
            m>>=1;
            k=s_allowed.substring(m,m+1);
            j+=k; ++s_len;
            }
        }

    //    八桁入力されているか?
    document.forms[0].number.value=j;    //    半角化された文字列をフォームに与える。
    if (s_len!=8) {
        window.alert('八桁で入力して下さい。');
        return(false);
        }

    //    正常終了。
    return(true);
}

一方、HTML文書側には、以下のように記述されております。

<form action=" (略) " method="post" onsubmit="return(CheckNumberEnter());">
    <fieldset>
        <legend>認証入力</legend>
        <dl>
            <dt>会員番号(八桁)</dt>
            <dd><input type="text" name="number" size="16" /></dd>
            </dl>
        <ul>
            <li><input type="submit" value="送信" /></li>
            </ul>
        </fieldset>
    </form>

スクリプトの構成。(平成17年 8月21日 更新)

スクリプトの起動。(平成17年 8月21日 修正)

スクリプトはフォームの送信ボタンが押された時に起動します。

これは、<form>要素のonsubmit属性で実現します。

onsubmit属性は、当該<form>要素の送信手続きをイヴェントとして行なうイヴェントハンドラで、この属性値となるJAVAスクリプトが実行されます。

ここでは、CheckNumberEnter()函数を実行した結果をreturn文で返すというだけですが、その際にエラーを見出した場合はfalse値を返して送信をやめさせます。

スクリプトの処理。

スクリプトの処理は、会員番号入力フィールドに入力されている文字列を取り出し、

  1. 全角数字が混じっている場合は半角数字に変換する(この文字に関しては正当な入力とする)
  2. 半角数字以外の文字が入っている場合はエラーとする
  3. 文字数が8以外の場合はエラーとする

と言うものです。

以下、具体的な処理を解説して行きましょう。

0. 初期設定。

スクリプト冒頭は以下のようになります。

s_allowed='0123456789';            //    半角数字(ここに入っていない文字があったらエラー)。
s_allowed_zen='0123456789';    //    全角数字(上の文字列と対応するように並べる事)。
s_error='数字以外は入力出来ません!';    //    不正文字のエラーメッセージ。

function CheckNumberEnter() {
    s_len=0;
    i=document.forms[0].number.value;
    j='';

今回は同じエラーメッセージが何度も出てくるので、予め変数で定義してスクリプトの冒頭に書いておきました。

カスタマイズされる場合は、ここを修正すれば良いでしょう。

  1. 最初の変数は、正当な数字のリストです。ここに数字以外の文字を入れれば、記号のチェックも可能になります。
  2. 続いて、二番目の変数は、正当な全角数字のリストです。一行目の半角数字リストに対応するような順番で書く必要があります。
  3. 最後は数字以外の文字を見出した場合のエラーメッセージです。

続いて、フォームのボタンが押された際に呼出される函数CheckNumberEnter()の本体が始まります。

まず、文字の長さをカウントする変数s_lenを0に初期化して、続いて、変数iにてフォームの会員番号入力欄の値を取得します。

変数jは全角数字を補正したあとの入力文字列が入ります。

エラー無しで判定が終わったら、最後に、入力フォームの当該欄に補正された文字列を入れる事で、CGI側の余計な負担(文字のチェックや全角数字の変換など)を減らせると言う訳です。

1. 入力文字の確認。

続いて、入力文字の確認を行ないます。

ここでの基本的な処理は、

と言うだけのものです。

ところが、ブラウザによって日本語文字の扱いが異なっており、

と言う違いがあります(現行のブラウザは全て全角文字を一文字と見なしますが、旧いブラウザでは全角文字を二文字と見なすものがあります)。

このため、全角文字の扱いによって処理を変える必要があります。

全角文字を一文字と見なすブラウザの場合。

この場合、何も考えず頭から一文字づつ取出して、それぞれが数字かどうかを判定すれば良いでしょう。

このとき、全角数字を取出した場合は半角数字に変換してしまいます。

この処理は以下のようになります。

    //    全角文字を一文字と認識する環境。
    if ('あ'.length==1) {
        while (i!='') {
            k=i.substring(0,1);
            i=i.substring(1,i.length);
            //    全角数字なら半角に変換する。
            m=s_allowed_zen.indexOf(k); if (m>-1) k=s_allowed.substring(m,m+1);
            //    正しい数字か?
            if (s_allowed.indexOf(k)<0) { window.alert(s_error); return(false); }
            j+=k; ++s_len;
            }
        }

処理の流れは以下の通りです。

  1. 初めに、全角文字「あ」の文字数をlengthプロパティで数えて、それが1ならこのスクリプトを走らせているブラウザは全角文字を一文字扱いするブラウザと分かります。
  2. あとは、文字列を頭から順に一文字づつ切出して行って、チェックを行なって行きます。

    substringメソッドで頭の一文字を切出し、元の変数iは頭の一文字を切り捨てます。

  3. 続いて、全角数字リストを調べ、その中に含まれていれば半角数字リストの対応する文字をsubstringメソッドで取出す事で半角変換を行ないます。
  4. 全角数字リストに無ければ、今度は半角数字リストを調べ、その中にも無ければ不当な入力と見なしてエラーとします。
  5. 正当な文字と判定出来たら、文字数を表す変数s_lenに一を加え、処理後の文字列を表す変数jの後ろに取出した文字(全角数字の場合は半角数字に変換されている)を継ぎ足し、次の文字のチェックに入ります。

全角文字を二文字と見なすブラウザの場合。

この場合の処理は以下のようになります。

    //    全角文字を一文字と認識しない環境。
    else {
        while (i!='') {
            k=i.substring(0,1);
            i=i.substring(1,i.length);
            //    半角数字なら問題無い。
            if (s_allowed.indexOf(k)>-1) { j+=k; ++s_len; continue; }
            //    全角数字か調べ、そうなら半角に変換する。
            //    文字が残っていなければエラー。
            if (i=='') { window.alert(s_error); return(false); }
            //    もう一文字取り出す。
            k+=i.substring(0,1);
            i=i.substring(1,i.length);
            m=s_allowed_zen.indexOf(k);
            //    変換出来なかったらエラー。
            if (m<0 || (m & 1)!=0) { window.alert(s_error); return(false); }
            m>>=1;
            k=s_allowed.substring(m,m+1);
            j+=k; ++s_len;
            }
        }

いきなりelseで始まっていますが、これは前にある全角文字を一文字扱いする処理の冒頭で全角文字を何文字扱いするかの判定を行なっているからです。

この後の処理の流れは以下の通りです。

  1. まず、文字列を頭から順に一文字づつ切出して行って、チェックを行なって行きます。

    この場合、全角文字に関しては、前半分だけが取出されているため、全角文字の判定はこの時点では不可能です。

    そこで、まず半角文字のチェックを行ないます。

  2. 正しく判定出来なかった場合は、全角数字で無ければエラーとなるため、全角文字のチェックを行ないます。

    とは言うものの、この時点で切出せる文字が残っていなかったら全角文字で無い=エラーとなるので、それをチェックします。

    その上で、もう一文字取出して切出した文字の後ろに継足します。

  3. これで、全角数字と判定出来なかったらエラー、判定出来たら対応する半角数字を取出してそれに変更したものを判定済み文字列に継足します。

2. 不正な文字が無い場合。

以上の判定を行なって、エラーが見出されなければ、入力文字は不当で無い事が分かります。

そこで、最後の処理を行ないます。

まず、全角文字を半角に変換した文字列をフォームに返します。
返さなくてもCGI側で同様の処理を行なえば良いのですが、それでは勿体無いのでこちらで補正したデータに書き変えてやります。
続いて、所定の字数かどうかを判定します。
今回は八桁と決められておりますが、場合に依っては○桁ないし△桁と言う条件も必要になるでしょう(必要な方は各自やってみて下さい)。
最後に問題が無ければ正常終了する。
正常終了を通知して漸くフォームのデータがCGIにポストされます。

これらの処理は以下のようになります。

    //    八桁入力されているか?
    document.forms[0].number.value=j;    //    半角化された文字列をフォームに与える。
    if (s_len!=8) {
        window.alert('八桁で入力して下さい。');
        return(false);
        }

    //    正常終了。
    return(true);
}
  1. document.forms[0].number.value=j;」とする事で、フォームに補正されたデータが書き込まれます。

    フォーム入力欄オブジェクトのvalueプロパティに文字列を入れると書き換えられるのは、フォームを扱うスクリプトで紹介したスクリプトにもありますが、本来はこうやって間違いを補正した結果を与えたりするのに用いるべきものです。

  2. 続いて字数判定です。

    lengthプロパティではなく、わざわざカウント変数s_lenを用いているのは全角文字の扱いが異なるブラウザがあるためです。

  3. 最後に問題無ければ「return(true);」で正常終了とします。

このスクリプトの応用。

いろいろな応用が出来るでしょう。

振り仮名の入力チェック
この場合は、

を全角カタカナに統一する事になるでしょう。

欲を言えば、ローマ字にも対応出来ると更に良いでしょう。

電話番号の入力チェック
電話番号の場合、幾つかのフォーマットがあります。

こちらでフォーマットを制限しても良いのですが、制限を無くした方が親切でしょう。

そこで、エラーにはならないものの入力に反映させない文字をチェックすると言う処理を付け足せばよいでしょう。

このスクリプトを使うに当たって。

このスクリプトをそのまま使うにしても、書きなおして使うにしても、考えておくべき事があります。

それは、ブラウザごとの全角文字の扱いの違いにどう対応するかと言う事です。

実際のところ、ネットスケープ 4.06以降のブラウザは全て日本語文字を一文字扱いしており、しかもネットスケープ 4.7より前のブラウザは殆ど残っておりませんので、そう言うブラウザは最早無視しても問題無いと思う方がいるかも知れません。

つまり、全角文字を常に一文字と判断するブラウザのみを対象とするようにしても良いのではないかと言う事です。

それでも、旧いブラウザのための処理を省略するにしても、スクリプトエラーにならないようにするなどの配慮は怠らないで欲しいものです。

このための対策として最も単純なやり方は、上記のスクリプトでの「全角文字を一文字と認識しない環境。」のelse文を以下のように書き換えてしまうと言うものです。

    //    全角文字を一文字と認識しない環境。
    else {
        return(true);
        }

つまり、全角文字を一文字と認識しない旧式の環境では、入力文字のチェックをブラウザ側では一切やらず、正常なものと見なしてしまう、すなわち、CGIでの文字判定処理にげたを預けてしまうと言う訳です。

しらぎくのウェブサイト作成入門サイトマップ



marguerite.site@gmail.com