Note: この記事は、3年以上前に書かれています。Webの進化は速い!情報の正確性は自己責任で判断してください。
HTMLのForm要素、checkboxの入力チェックをするJavascript。実は意外な落とし穴があったりするのですが、↓のサンプルは対応済み。
Script
function chNull(msg,obj) {
if(!obj) return true;
if((obj.type || obj[0].type) == 'checkbox'){
var flag = 0;
if(obj.length){
for(var i=0; i<obj.length; i++) { if(obj[i].checked) flag = 1; }
} else {
if(obj.checked) flag = 1;
}
if(flag == 0) {
alert(msg + 'を選択してください。');
return false;
}
}
return true;
}
解説
チェックボックス上から1つずつ確認していって、1つでもチェックされていたら「flag = 1」にする。で、flagが0のままならalert出すと。
7~11行目は、次のように書くこともできる。
for(var i=0; i<obj.length; i++) if(obj[i].checked) flag = 1;
何故こうしなかったかというと、checkboxが1つだけの場合にうまく動かないから。これはJSの妙な挙動で、「配列の要素が1つだけ」の場合は、配列として扱われない。つまり変数扱いになるわけね。
if(obj.length){
for(var i=0; i<obj.length; i++) { if(obj[i].checked) flag = 1; }
} else {
if(obj.checked) flag = 1;
}
で、上のようになったと。この記述が意味を持ってくるのはブログの管理画面なんかで、記事一覧からまとめて削除する時とか。動的に生成されてる要素では、チェックできる記事やコメントが1つだけってのは十分ありうる話。
追記(2006.10.11)
Nein!さんからレビュー貰いました。
これは引数で渡すからであって、最初から配列を返すメソッドを使えば問題はない。 – Nein!, Javascript - 入力チェック
一連のレビューの完成版によると、つまり7~11行目は、次のように書くことができる。
var list=document.getElementsByName(objName);
for(var i=0;i<list.length;i++){
if(list[i].checked){
flg = 1;
}
}
うん、完璧! 後は対応ブラウザとご相談。
Note: スパム対策が面倒なので、コメント投稿を廃止しました。以前のコメントは残します。
ご意見・ご要望はtwitter@sigwygかはてブコメントにて。