チェックボックスの確認にはフォームのチェックボックスを確認するスクリプトで解説した方法が考えられます。
ただ、この方法は
と言う欠点があります。
そこで、これらの問題を解決した別解を解説します。
こちらはスクリプトがちょっと長いと言うのがありますが、汎用性を高めた記述となっております。
以下のフォームでは、ご利用になっている検索エンジンを撰んで頂きます。
スクリプトを実行出来る環境なら、
フォームのチェックボックスを確認するスクリプトの別解「CheckCheckBox.js」は以下のようになっております。
// 汎用のチェックボックスチェック処理。function CheckCheckBox(formNO,nam,msg) {var f=document.forms[formNO].elements;var cf=0;var i=-1;var j,k;while (++i<f.length) {if (!(f[i].type)) continue;if (f[i].type.tolowerCase()!='checkbox') continue;if (f[i].name!=nam) continue;if (f[i].checked) cf=1;}if (cf==0) {window.alert(msg+'が選択されておりません!');return(false);}return(true);}// 特定のチェックボックスが選択されている場合に限ってと他の入力欄の汎用のチェックボックスチェック処理。function CheckCheckBoxAndText(formNO,name1,value1,name2,msg1,msg2) {var f=document.forms[formNO].elements;var cf=0;var tf=0;// チェックボックスの判定。var i=-1;var j,k;while (++i<f.length) {if (!(f[i].type)) continue;if (f[i].type.tolowerCase()!='checkbox') continue;if (f[i].name!=name1 || f[i].value!=value1) continue;if (f[i].checked) cf=1;}// テキスト入力欄の判定。i=-1;while (++i<f.length) {if (!(f[i].type)) continue;if (f[i].type.tolowerCase()!='text') continue;if (f[i].name!=name2) continue;if (f[i].value!='') tf=1;}if (tf && cf || !tf && !cf) return(true);if (tf) {window.alert(msg1);return(false);}window.alert(msg2);return(false);}// 本体。function Check() {return (CheckCheckBoxAndText(0,'search','others','sename','検索エンジン名を入力する場合は、"その他"を指定して下さい。','"その他"を選んだ場合は、検索エンジン名も入力して下さい。') && CheckCheckBox(0,'search','検索エンジン名'));}
一方、HTML文書側には、以下のように記述されております。
フォームのチェックボックスを確認するスクリプトに較べて、各チェックボックスとなる<input type="checkbox">要素にonclick属性やonkeypress属性が使われず、単純になっているのが分かると思います。
<form action="(略)" method="post" onsubmit="return(Check());" class="important"><fieldset><legend>アンケート</legend><p>いつもお使いの検索エンジンを教えて下さい(複数選択可)。</p><ul><li><label><input type="checkbox" name="search" value="yahoo" />ヤフージャパン</label></li><li><label><input type="checkbox" name="search" value="googole" />グーグル日本</label></li><li><label><input type="checkbox" name="search" value="infoseek" />インフォシーク</label></li><li><label><input type="checkbox" name="search" value="others" />その他</label>(検索エンジン名:<input type="text" name="sename" size="24" />)</li></ul><ul><li><input type="submit" value="送信" /><input type="reset" value="リセット" /></li></ul></fieldset></form>
フォームのチェックボックスを確認するスクリプトの別解がどのようになっているのかを解説します。
フォームのチェックボックスを確認するスクリプトでは、変数を使ってチェックボックスが変化する度に変数の値を変え、それをチェックする方法を採りました。
別解では、フォーム内の要素から該当するチェックボックスの状況を調べて判定します。
ただ、この方法だけでは、特定のチェックボックスが選択された際には併せて特定のテキスト入力欄に記入されるべきであると言うのを判定出来ないので、これを別の処理でチェックします。
以上をまとめると以下の三部構成となります。
汎用チェックボックスチェック処理 CheckCheckBox() 函数は、
を与えて呼び出します。
長いので、当該箇所を全部抜き出して解説します。
// 汎用のチェックボックスチェック処理。function CheckCheckBox(formNO,nam,msg) {var f=document.forms[formNO].elements;var cf=0;var i=-1;var j,k;while (++i<f.length) {if (!(f[i].type)) continue;if (f[i].type.tolowerCase()!='checkbox') continue;if (f[i].name!=nam) continue;if (f[i].checked) cf=1;}if (cf==0) {window.alert(msg+'が選択されておりません!');return(false);}return(true);}
まず、document.forms[0].elementsでHTML文書中第一引数で指定されたのフォーム内のチェックボックスなどの子要素オブジェクトの配列を取得して変数 f に代入します。
f は当然配列変数となります。そしてその配列を零番目から一つずつ調べて行きます。
cf に 1 を代入する事でフラグを立てます。一通り処理を終えたら、フラグが立っているかどうかを調べ、立っていなければ指定されたチェックボックスは全く選択されていないと言う事になるため、第三引数で指定されたチェックボックス名を組み合わせたエラーメッセージをwindow.alert()メソッドで表示させて、return(false); でフォーム提出処理を強制中断させます。
そうでなければどれか一つは選択された事となるので、return(true); でフォーム提出処理を継続させます。
特定のチェックボックスが選択されている場合に限ってと他の入力欄の汎用のチェックボックスチェック処理 CheckCheckBoxAndText() 函数は、特定のチェックボックスが選択されている場合に対応するテキスト入力欄が入力されているかを調べるもので、
を与えて呼び出します。
こちらはもっと長いので、当該箇所を全部抜き出して解説します。
// 特定のチェックボックスが選択されている場合に限ってと他の入力欄の汎用のチェックボックスチェック処理。function CheckCheckBoxAndText(formNO,name1,value1,name2,msg1,msg2) {var f=document.forms[formNO].elements;var cf=0;var tf=0;// チェックボックスの判定。var i=-1;var j,k;while (++i<f.length) {if (!(f[i].type)) continue;if (f[i].type.tolowerCase()!='checkbox') continue;if (f[i].name!=name1 || f[i].value!=value1) continue;if (f[i].checked) cf=1;}// テキスト入力欄の判定。i=-1;while (++i<f.length) {if (!(f[i].type)) continue;if (f[i].type.tolowerCase()!='text') continue;if (f[i].name!=name2) continue;if (f[i].value!='') tf=1;}if (tf && cf || !tf && !cf) return(true);if (tf) {window.alert(msg1);return(false);}window.alert(msg2);return(false);}
まず、初めの指定されたチェックボックスの判定は汎用のチェックボックスチェック処理と殆ど同じものです。
但し、value属性値もチェックするため、valueプロパティも確認します。
続いて、指定されたテキスト入力欄についての判定を行いますが、これも汎用のチェックボックスチェック処理と余り変わりません。
強いて言えば、
位の違いのみです。
最後に、
には正常終了とし、return(true); でフォーム提出処理を続行させます。
そうでない場合には不正な入力状況となるため、エラーメッセージをwindow.alert()メソッドで表示させます。
HTMLから呼び出される処理本体は Check() 函数としております。
処理自体は単純ですが、ソースがかなり前にあるので改めて掲載しましょう。
// 本体。function Check() {return (CheckCheckBoxAndText(0,'search','others','sename','検索エンジン名を入力する場合は、"その他"を指定して下さい。','"その他"を選んだ場合は、検索エンジン名も入力して下さい。') && CheckCheckBox(0,'search','検索エンジン名'));}
函数の引数の記述が長いので分かり難いかも知れませんが、この処理は return()文一つのみです。
引数を省略すると
return (CheckCheckBoxAndText(…) && CheckCheckBox(…));となり、要するに
のいずれもが true 値を返してきた場合にのみ返す値を true値としてフォーム提出処理を続行させ、そうでない場合には返される値は false 値となってフォーム提出処理が中断されると言うものです。
尚「甲 && 乙」と言う論理積演算は、甲
が false値, 零またはヌルの場合にはその時点で乙
を評価せずに その値を与えるものとなります。
乙
が評価されるのは甲
が true値, 非零数値または非ヌルである場合のみで、この場合に限り乙
の評価値が返されます。
つまり、この処理では甲
に当たるCheckCheckBoxAndText()函数が true値を返さない場合には乙
に当たるCheckCheckBox()函数は呼び出されさえしない事となります。
この順序は重要で、もし逆の順序であれば、CheckCheckBox()函数が true値を返さない場合にはCheckCheckBoxAndText()函数が全く呼び出されさえしない事となり、その結果、
検索エンジンが選択されておりません!と言う、入力したにも拘らず入力していない場合にのみ出されるべきエラーメッセージが出てしまいます(この場合好ましいエラーメッセージは検索エンジン名を入力する場合は、"その他"を指定して下さいとなる筈です)。
Copyright ©平成19年-平成24年 さいたま・しらぎくさいと 版権所有
marguerite.site@gmail.com