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

ページ案内

フォームのチェックボックスを確認するスクリプト。

フォームのチェックボックスを確認するスクリプト・目次。

フォームのチェックボックスを確認するスクリプトの概要。

入力フォームには幾つかのタイプがあり、その中の一つにチェックボックスと言うものがあります。

これは、複数選択可能な選択肢を与えるものです。

チェックボックスの場合、複数選択が出来る一方、逆に全く選択しないと言うのもあり得ます。

しかし、それでは都合が悪い場合もあるでしょう。

そこで、事前に無選択状態かどうかを確認出来ると便利です。

ここでは、チェックボックスが選択されているかを確認するスクリプトをご紹介します。

フォームのチェックボックスを確認するスクリプトのサンプル。

以下のフォームでは、ご利用になっている検索エンジンを撰んで頂きます。

スクリプトを実行出来る環境なら、

  1. 全く選択せずに送信ボタンを押すと、エラーダイアログが開く筈です。
  2. また、その他を選択した場合は、そのあとの検索エンジン名の入力フィールドに、お使いの検索エンジン名を入力しなければなりません。
  3. 逆に、検索エンジン名の入力フィールドに、お使いの検索エンジン名を入力しているのに、その他が選択されていない場合もエラーとなります。
アンケート

いつもお使いの検索エンジンを教えて下さい(複数選択可)。

フォームのチェックボックスを確認するスクリプトのソースとHTML文書での記述。

フォームのチェックボックスを確認するスクリプトのソース。

フォームのチェックボックスを確認するスクリプト「CheckCheckBox.js」は以下のようになっております。

s_val=0;

function CheckCheckBox() {
    if (document.forms[0].sename.value!='' && (s_val & 8)==0) {
        window.alert('検索エンジン名を入力する場合は、"その他"を指定して下さい。');
        return(false);
        }
    if (s_val==0) {
        window.alert('いずれか一つ以上を選択して下さい。');
        return(false);
        }
    if ((s_val & 8)!=0 && document.forms[0].sename.value=='') {
        window.alert('"その他"を選んだ場合は、検索エンジン名も入力して下さい。');
        return(false);
        }
    return(true);
}

フォームのチェックボックスを確認するスクリプトを実行するHTML文書の記述。

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

    <form action=" (略) " method="post" onsubmit="return(CheckCheckBox());" onreset="s_val=0;">
        <fieldset>
            <legend>アンケート</legend>
            <p>いつもお使いの検索エンジンを教えて下さい(複数選択可)。</p>
            <ul>
                <li><label><input type="checkbox" name="search" value="yahoo"    onclick="s_val^=1;" onkeypress="return(true)" />ヤフージャパン</label></li>
                <li><label><input type="checkbox" name="search" value="googole"  onclick="s_val^=2;" onkeypress="return(true)"/>グーグル日本</label></li>
                <li><label><input type="checkbox" name="search" value="infoseek" onclick="s_val^=4;" onkeypress="return(true)"/>インフォシーク</label></li>
                <li>
                    <label><input type="checkbox" name="search" value="others" onclick="s_val^=8;" onkeypress="return(true)"/>その他</label>
                    (検索エンジン名:<input type="text" name="sename" size="24" />)
                    </li>
                </ul>
            <ul>
                <li>
                    <input type="submit" value="送信" />
                    <input type="reset" value="リセット" />
                    </li>
                </ul>
            </fieldset>
        </form>

フォームのチェックボックスを確認するスクリプトの構成。

フォームのチェックボックスを確認するスクリプトがどのようになっているのかを解説します。

まず抑えておきたい事。

入力フォームの内容を確認する場合には、Formオブジェクトvalueプロパティを調べました。

このとき、対応する入力フィールドとなる<input>要素のname属性値を用いて参照しておりました。

これは、フォーム内に同じname属性値を持つ<input>要素が他に無いからこそ利用出来たのです。

しかし、チェックボックスの場合、同じname属性値を持つ<input>要素が幾つもあり、valueプロパティを調べる事が出来ません

そこで、チェックボックスの状況を調べるには幾つかの手続きが必要になるのです。

スクリプトの初期設定。

このスクリプトは、HTML文書のヘッダに<script src="CheckCheckBox.js">要素で呼出されるようになっており、その際に、一行目の「s_val=0;」が実行される事で、初期設定が完了します。

変数 s_val は、チェックボックスの選択肢が選択されたかどうかを表すフラグが入ります。

JAVAスクリプトでは、実行時に参照される変数を予め初期化しておかなければなりません

このため、予め0を代入する事で初期化をしておきます。

チェックボックスが選択/取消しされた場合の処理。

各チェックボックスに対応する<input type="checkbox" name="search">要素内に、onkeypress属性で実行させる処理を書いております。

その処理は、以下のようなものです。

s_val^=;

この「^=」は左辺と右辺の排他的論理和を取って代入する代入演算子で、フラグを反転させるために用いております。

例えば、一番目の<input type="checkbox" name="search">要素内には、

s_val^=1;

となっており、一番目の選択肢を選択すると、s_valの1に対応するビットと1とで排他的論理和が取られた結果が代入されます。

奇数回目の選択行為では、s_valの1に対応するビットが0となっているため、1との排他的論理和の結果1に対応するビットが1になります。

偶数回目の選択行為(この場合選択が取消される操作になります)では、s_valの1に対応するビットが1となっており、1との排他的論理和の結果1に対応するビットが0になります。

このように、排他的論理和を取る事でフラグの反転が可能になります。

尚、onclick属性とonkeypress属性を併用するに当たって、onkeypress属性では何も処理しておりませんが、これはブラウザに依ってチェックボックスを操作するキーが異なっている事に依ります。

リセットボタンが指定された場合の処理。

<form>要素には「onreset="s_val=0;"」属性が埋め込まれております。

これは、フォーム内のリセットボタンが押された際に発生するイヴェントで、ここでは「s_val=0;」が実行される事になります。

フォームの状態と変数は全く独立しているため、このようにフォームの初期化と同時に変数も初期化する必要がある訳です。

実際の入力確認函数。

実際の入力判定函数は、フォームの送信ボタンが押された時に起動します。

これは、<form>要素のonsubmit属性に依って実現します。

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

ここでは、CheckCheckBox()函数を実行した結果をreturn文で返すと言うだけですが、正常に処理出来ない場合はfalseを返してフォームへの送信手続きをやめさせます。

何を調べるべきか?

ところで、実際に何を調べるべきでしょうか。

取敢えず、箇条書きにしてみましょう。

チェックボックスが全く選択されていない場合はエラーにする。
当然過ぎるくらい当然ですね。
その他が選択されている場合は、テキスト入力が無いとエラーとなる。
その他が選択される場合は、代りに答えをテキストで入力してもらいます。
逆に、テキスト入力があるのにその他が選択されていない場合もやはりエラーとなる。
その他が選択されているのにテキスト入力が無いのはおかしいなら、逆にテキスト入力があるのにその他が選択されていないのもおかしいですね。

と言う事になるでしょう。

では、この順序で判定しましょう…と言いたいところなのですが、最後のテキスト入力があるのにその他が選択されていない場合、他のチェックボックスが全く選択されていない場合は一番初めのチェックボックスが全く選択されていない場合はエラーにする事からこの時点でエラーになります。

それでも良いのですが、

  1. テキスト入力をしている場合には他のチェックボックスを選択しない可能性がかなり高い事、
  2. そのような状況で洗濯していない旨のエラーを出すと、「入力したのにエラーになった」と利用者を惑わす恐れがある。

と言う事を考えると、チェックボックスが全く選択されていないかどうかを確認する前にテキスト入力を確認する方が良いでしょう。

結局、

  1. まず、テキスト入力があるのにその他が選択されていない場合はエラーとする。
  2. 続いて、チェックボックスが全く選択されていない場合もエラーにする。
  3. 最後に、その他が選択されている場合は、テキスト入力が無いとエラーとなる。

と言う順序で判定するのがベターと言えます。

1. テキスト入力されている場合に、その他が選択されているかを確認する。

まず、テキスト入力があるのにその他が選択されていない場合はエラーとする処理を見てみましょう。

以下のようなコードになります。

    if (document.forms[0].sename.value!='' && (s_val & 8)==0) {
        window.alert('検索エンジン名を入力する場合は、"その他"を指定して下さい。');
        return(false);
        }

テキスト入力がされている場合は、document.forms[0].sename.valueプロパティを調べて空で無ければ、何か入力されていると判断出来ます。

続いて、四番目のチェックボックスが選択されていない場合、変数 s_val には8に対応するビットが0になっている筈で、この事は8との論理積を取る事で調べる事が出来ます。

結果、0だった場合は不適切と言う事になるため、エラーと見なします。

2. チェックボックスが選択されているかどうかを確認する。

続いて、チェックボックスが全く選択されていない場合もエラーにする処理をご覧下さい。

    if (s_val==0) {
        window.alert('いずれか一つ以上を選択して下さい。');
        return(false);
        }

チェックボックスが全く選択されていない場合、チェックボックスの状態を入れている変数 s_val は0になっている筈で、その場合はエラーダイアログを出し、「return(false);」で処理を中断させます。

3. その他が選択されている場合に、テキスト入力がされているかを確認する。

最後に、その他が選択されている場合は、テキスト入力が無いとエラーとなる処理です。

    if ((s_val & 8)!=0 && document.forms[0].sename.value=='') {
        window.alert('"その他"を選んだ場合は、検索エンジン名も入力して下さい。');
        return(false);
        }

具体的には、四番目のチェックボックスが選択されている場合に、となりのテキスト入力フィールド(<input type="text" name="name">要素)に何か入力されているかを調べます。

四番目のチェックボックスが選択されている場合、変数 s_val には8に対応するビットが1になっている筈で、この事は8との論理積を取る事で調べる事が出来ます。

続いて、document.forms[0].sename.valueプロパティを調べて空文字列であれば、エラーダイアログを出して処理を中断させます。

4. 正常に終了した場合の処理。

以上の一連の確認が終わって、漸く、

return(true);

が実行されます。

この場合に限って、フォーム送信手続きが続行される事となります。

最後に。

このスクリプトは内容は単純ですが、

など若干不便かも知れません。

そこで、スクリプトはかなり長くなりますが、別解も用意しましたので参考にして下さい。

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



marguerite.site@gmail.com