• ベストアンサー

checkboxのグループ選択

住所を選択するという画面を作っているのですが、 市町村名と大字名が表示されていて、全てにチェックボックスがあります。 そこで、市町村のチェックボックスを選択すると配下の大字全てにチェックが入るようにしたいです。 チェックボックスのnameを二次元配列にて構築しているのですが、「nullかオブジェクトがありません」というエラーが出てしまいます。 以下はjavascript分のみ抜粋しています。 function 関数名(引数a:市町村コード) { flag = document.form1.name[a][0].checked; for(var i=0;i<document.form1.name[a].length;i++){ document.form1.name[a][i].checked = flag; } } nameはチェックボックスのnameです。 どなたかご教授下さい。

質問者が選んだベストアンサー

  • ベストアンサー
noname#20964
noname#20964
回答No.4

name属性を要素を参照するためだけに使うのでしたら document.form1.elements[参照番号] document.getElementsByTagName('input')[参照番号] でも参照できますよ。 これらで配列を返してくれますので0を先頭にして各要素を参照できます。 どうしても二次元にしたければ グループをfieldsetで分けて document.getElementsByTagName('fieldset')[参照番号].getElementsByTagName('input')[参照番号] のようにすると二次元になります。

S202
質問者

お礼

遅くなってしまい申し訳ありませんでした。 アドバイスどおりでできました。 ありがとうございました。

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

ごめんなさい。#1、#2は勘違いはなはだしいですね。 これでいけます。やってみてください <script language=javascript> function checkFunc(obj){ var obj2=obj.form[obj.name] for (var i=0;i<obj2.length;i++){ obj2[i].checked=obj.checked; } } </script> <form> <input type="checkbox" name="name[0][]" onClick="checkFunc(this)">a <input type="checkbox" name="name[0][]">a-1 <input type="checkbox" name="name[0][]">a-2 <input type="checkbox" name="name[0][]">a-3 <input type="checkbox" name="name[0][]">a-4<br> <input type="checkbox" name="name[100][]" onClick="checkFunc(this)">b <input type="checkbox" name="name[100][]">b-1 <input type="checkbox" name="name[100][]">b-2 <input type="checkbox" name="name[100][]">b-3 <input type="checkbox" name="name[100][]">b-4<br> </form>

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>配列の[a]は[1]ではだめなのでしょうか? IE6やfirefox1.5で検証しました。 数字でもなんの支障もありません。 >nameのオブジェクトがありませんというエラーと なってしまいます。 とりあえずコピペして私のスクリプトがそのまま 動くかどうか検証してみてください。 >javascriptで1000件以上のチェックボックスを >全てリード(文字列比較などの処理)するとなると >時間がかかるものでしょうか? やってみました。 1000件くらいなら1秒かからないでしょう。 感じからすると一瞬です。処理が複雑になれば それなりの工夫が必要になってくると思います。 ただcheckboxが1000個ならぶと見た目上なにがなんだか わからなくなるので、作業できないと思います。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

そりゃあinputタグのnameはあくまでも名前なので いくらそれらしく書いても配列にはなりません。 いっそのこと以下のように前方一致させて判断する ということでいかがでしょうか? (submitした際に受け取り側では配列として認識して くれるんですけどねぇ・・) <script language=javascript> function checkFunc(obj){ var f=obj.form; for(var i=0;i<f.length;i++){ if(f[i].name.indexOf(obj.name)==0) f[i].checked = obj.checked; } } </script> <form> <input type="checkbox" name="name[a]" onClick="checkFunc(this)">a <input type="checkbox" name="name[a][1]">a-1 <input type="checkbox" name="name[a][2]">a-2 <input type="checkbox" name="name[a][3]">a-3 <input type="checkbox" name="name[a][4]">a-4<br> <input type="checkbox" name="name[b]" onClick="checkFunc(this)">b <input type="checkbox" name="name[b][1]">b-1 <input type="checkbox" name="name[b][2]">b-2 <input type="checkbox" name="name[b][3]">b-3 <input type="checkbox" name="name[b][4]">b-4<br> <input type="checkbox" name="name[c]" onClick="checkFunc(this)">c <input type="checkbox" name="name[c][1]">c-1 <input type="checkbox" name="name[c][2]">c-2 <input type="checkbox" name="name[c][3]">c-3 <input type="checkbox" name="name[c][4]">c-4<br> </form>

S202
質問者

補足

ありがとうざいます。 配列の[a]は[1]ではだめなのでしょうか? 同じ処理をしているはずなのですが、nameのオブジェクトがありませんというエラーとなってしまいます。 表示処理はPHPで行っているので、数字以外となると難しいのです。 あと、javascriptで1000件以上のチェックボックスを全てリード(文字列比較などの処理)するとなると時間がかかるものでしょうか?