CHECKBOXをチェックする

[上に] [前に] [次に]
やま [E-Mail] 1999/03/03(水) 04:41:59
<FORM NAME="form" onSubmit="return check()">
<INPUT TYPE=CHECKBOX NAME="CHK" VALUE="1">1
<INPUT TYPE=CHECKBOX NAME="CHK" VALUE="2">2
<INPUT TYPE=CHECKBOX NAME="CHK" VALUE="2">2
<INPUT TYPE=SUBMIT>
</FORM>

というフォームで、SUBMITされたときにどれでもいいので1つ以上チェックされているかどうかチェックして、されていなければ警告を出すJavaScriptを作りたいのですが、

<SCRIPT LANGUAGE="JavaScript">
  <!--
   function check() {
     if( ---- ????? ----
     alert("選択してください。");
     return false;
     } else {
     return true;
    }
   }
  // -->
</SCRIPT>

おそらく、document.form.CHK.checkedを使うのであろうというところまではたどり着いたのですが、---- ????? ----の部分の書き方がどうしても分かりません。
どなたか、このJavaScript超初心者にアドバイスいただけませんでしょうか。

Tiot 1999/03/03(水) 05:24:04
<SCRIPT LANGUAGE="JavaScript">
<!--
function check() {
    if( !(document.form.elements[0].checked ||
       document.form.elements[1].checked ||
       document.form.elements[2].checked)) {
        alert("選択してください。");
        return false;
    } else {
        return true;
    }
}
// -->
</SCRIPT>
チェックボックスが同じ名前なら、エレメントが格納されている
配列で値を取るのが無難。
もちっと、スマートな方法があるかもしんない。

ポケ鬼!! 1999/03/03(水) 10:59:33
本題からズレますが、CHECKBOXのNAMEが全部同じなのはなぜ?
その合理性が分からないのですが。

とこやん 1999/03/03(水) 19:23:14
ポケ鬼!! さん>CHECKBOXのNAMEが全部同じなのはなぜ?

私もこの手のチェックボックスをよく利用するんですが、
やっぱしまずいんでしょうか?
りんごとみかんとバナナはフルーツというグループにいるわけで、
その中から好きなものを複数選べっていう場合は、こういう使い方になっちゃいますよね。

というわけで、こうゆうのはどうですか?

というのも、チェックボックスは一つしかない場合には配列にならないそうなんです。
だからもしCGIなどがチェックボックスを生成するので、1つかもしれないし
2つ以上かもしれないって場合は、まず「チェックボックスかどうか」を判定してから
オン、オフを確認するのが良いかも!
(私も以前ここでいいづかさんという方に教えて頂いたんですよ。)

function check() {
flag = 0;

 for(i=0;i<document.form.elements.length;i++){
  //エレメントがチェックボックスの時に処理を行う
  if(document.form.elements[i].type=="chekcbox"){
    if(document.form.elements[i].checked==true){
     flag = 1;
     break;
    }
  }
 }

 if(flag!=1) {
  window.alert("チェックボックスを選択してくれよ");
  return false;
 }

}

ドラクエの鬼!! 1999/03/03(水) 20:22:12
JavaScriptなら分かるけど、CGIで同じ名前のCHECKBOXを識別できるんですか?

やま 1999/03/03(水) 20:25:49
[[解決]]
ぎゃあ、入れ違いになってしまった〜。みなさまアドバイスありがとうございます。
僕もいろいろ考えていて、こんなのに到達しました。結局、ほとんど一緒です。
他人様の作ったものをコピーするのは簡単だけど、自分で考えるのはひと苦労ですね。
でも勉強になりました。

<SCRIPT LANGUAGE="JavaScript">
  <!--
   function check() {
     chk = 0;
     for(i = 0; i < document.form.elements.length; i++) {
      if((document.form.elements[i].name == "CHK") && (document.form.elements[i].checked)) { chk = 1; }
     }
     if(chk) { return true;
      } else {
       alert("選択してください");
       return false;
     }
   }
  // -->
</SCRIPT>

やま 1999/03/03(水) 20:26:31
> CGIで同じ名前のCHECKBOXを識別できるんですか?
できますよ。

ポケ鬼!! 1999/03/04(木) 11:35:12
私もドラクエの鬼!!さん(爆)と同じ疑問が・・・

普通に連想型配列で受け取ったら、$FORM{'CHK'}が最後の値で上書きされませんか?
それとも、取得のループの中で一個ずつみるのですか?

やま 1999/03/04(木) 18:14:36
そうですね。普通に連想配列に格納していくようなプログラムにしていると、最後の値しか読みとれませんね。ちょっと工夫しましょう。
おそらくループの中で、
  $FORM{$name}=$value;
の様になっていると思いますが、ここを
  if($FORM{$name} eq '') {$FORM{$name}=$value;} else {$FORM{$name}.=','.$value;}
とでもしておけば、すべて受け取れるでしょう。
  if($name eq 'CHK') {push(@CHK,$value);} else {$FORM{$name}=$value;}
とかでも。現在、僕はこちらを使っています。

Tiot 1999/03/04(木) 23:44:12
私も以前に似たような質問をした事があるので、その時のことを。
**cgi-lib.pl** の **ReadParse** ルーチンを使う場合です。
同名の値が2つ以上ある場合は\0を区切り文字として連想配列に格納されます。
$in{'name'} = "firstAns\0secondAns";
のような感じ。
($first, $second) = split(/\0/, $in{'name'});
等の方法で、取り出せます。
cgi-lib.plを使ってない場合は関係ありませんが、参考まで。

ポケ鬼!! 1999/03/05(金) 11:03:46
なるほど。
私なら複数選択可のCHECKBOXは別名にしますけど、こういうやりかたもあるんですね。
納得!

[上に] [前に] [次に]