ラジオボタンでのテーブル表示切替について

[統計] HTMLからXHTMLへの移行を進めていますか?



0   名前: まゆぷ : 2007/06/26(火) 02:01  ID:Iawx9Uxp sub-y8
ラジオボタンでのテーブル表示切替について教えて下さい。
ラジオボタンを選択するごとに対応するテーブルを表示させるという処理は下記の関数で動作確認ができたのですが、
ボタン選択時に表示したテーブル内でもさらにラジオボタンがあって、そこでも同じようにテーブル表示を切り替える
という処理をしたいのですが、初心者なので色々と調べたのですがこのような処理についての情報を得ることができませんでした。
少し急ぎのもので困っています。どのように記述すれば良いのでしょうか?教えて下さい。


★現在の関数記述★
<script language="javascript">
<!--
function ChangeDevTable(chkOBJ){
var n=document.frm.Dev.length - 0;
var j=chkOBJ.value;
if(chkOBJ.checked){
for(i=0;n>i;i++){
var k=""+i;
document.getElementById(k).style.display="none";
}
document.getElementById(j).style.display="inline";
}
}
//-->
</script>

★関数使用部分★
<fieldset>
<form name="frm" id="frm">
<input type="radio" name="Dev" id="Dev" value="0" onClick="ChangeDevTable(this);" checked>ラジオボタン1
<input type="radio" name="Dev" id="Dev" value="1" onClick="ChangeDevTable(this);">ラジオボタン2
<input type="radio" name="Dev" id="Dev" value="2" onClick="ChangeDevTable(this);">ラジオボタン3
<input type="radio" name="Dev" id="Dev" value="3" onClick="ChangeDevTable(this);">ラジオボタン4
</form>
</fieldset>

★ラジオボタン1のときにこのテーブルを表示する
<table cellspacing="0" cellpadding="0" name="table0" id="0" style="display:inline;">
<tr>
<td>(省略)</td>
</tr>
</table>
★ラジオボタン2のときにこのテーブルを表示する
<table cellspacing="0" cellpadding="0" name="table1" id="1" style="display:none;">
<tr>
<td>(省略)</td>
<td>
<fieldset>
<form name="myForm">
<input type="radio" NAME="section" checked>表示切替後のラジオボタン1<br>
<input type="radio" NAME="section">表示切替後のラジオボタン2
</form>
</fieldset>
</td>
</tr>
</table>

1   名前: 匿名 : 2007/06/26(火) 02:01  ID:x3eFWcQP sub-Cz
まず HTML を直して下さい。同じ id 値が複数あるとか、id 値が数値であるとか、form 要素が fieldset 要素の中にあるとか、ありえません。無茶苦茶です。

# DOCTYPE 宣言が見当たらないが Transitional DTD と仮定する。
# form 要素に id 属性と name 属性を両方指定してあるのは GOOD。

・ID はページ内の固有の要素を識別する。だから同一ページ内に同じ ID が現れることはない。
・document.getElementById(ID) は、その ID を持つ要素ノードを取得する。
・要素ノードは style プロパティを持つ。

ことが分かっていれば、難しくない問題だと思いますが。

2   名前: まゆぷ : 2007/06/26(火) 02:01  ID:Iawx9Uxp sub-y8
返信ありがとうございます。

ご指摘の通り、HTMLの見直しから始めたいと思います。
難しくないことなのかもしれないのですが、JavaScriptの勉強を始めてまだ間もないので
こちらで知恵を貸していただきたいと思って質問させていただきました。

このような処理について調べたい場合に参考になるサイトがありましたら
教えていただけませんでしょうか?どうぞよろしくお願いします。m(_ _)m

3   名前: 匿名 : 2007/06/26(火) 02:01  ID:3HnCq4Ds sub-Cz
本題の方は大丈夫なのかな。

・document.getElementById('ID').style.display = 'none';
→ <element id="ID" style="display: none">...</element> にする

・document.getElementById('ID').style.display = 'block';
→ <element id="ID" style="display: block">...</element> にする

さえ覚えればいけると思うのですが。注意点として

・HTML(XML)のルール上、id が数字で始まってはならない。
・HTML のルール上、table 要素は name 属性など持たない。
・table 要素がインライン要素(display: inline)になることはありえない(inline-table は除外)。



> このような処理について調べたい場合に参考になるサイトがありましたら

JavaScript を使う目的が Web ページ処理ならば、結局は HTML と CSS の操作なので、HTML/CSS のルールを覚えるのが先決。と言うか覚えてないと話にならんです。
http://www.kanzaki.com/docs/htminfo.html
http://www.asahi-net.or.jp/%7Esd5a-ucd/www/

JavaScript の基本文法に関しては、とりあえず下記を一読。
http://chaichan.web.infoseek.co.jp/src/2ndthema.htm

HTML/CSS 世界のデータを、JavaScript 世界のデータに変換する仕組みを DOM と呼びます。DOM を通せば、JavaScript で HTML/CSS データを操作することができます。
http://east.portland.ne.jp/%7Esigekazu/css/javascript.htm

DOM に関しては一刻も早く下記の表に慣れて下さい。
http://www2u.biglobe.ne.jp/%7Eoz-07ams/prog/dom-ref/object-index.html

4   名前: まゆぷ : 2007/06/26(火) 02:01  ID:Iawx9Uxp sub-y8
教えていただいたとおりに記述しましたら質問内容の分に関しては動作確認できました。
上記のサイトも参考になりました。本当にありがとうございました。

ただ、ひとつだけ不具合があって、表示切替後のラジオボタン2を選択した状態で
表示切替前のラジオボタン1〜4(2以外)を選択して、再び表示切替後のラジオボタンを
表示させると、前回選択したままの状態になってしまいます。

document.getElementById("ID").checed=True;

という処理をChangeDevTable(chkOBJ)の関数内に入れてみましたが無理でした。

どうすれば良いのでしょうか?

5   名前: 匿名 : 2007/06/26(火) 02:01  ID:ey/iH1GD sub-Cz
VB 経験者でしょうか。

> document.getElementById("ID").checed=True;

・JavaScript の Boolean 型は true/false
・スペルミス checed → checked
http://www2u.biglobe.ne.jp/%7Eoz-07ams/prog/dom-ref/HTML/HTMLInputElement.html#HTMLInputElement-checked

また、もし >>0 のソースコードを修正しておらず、getElementById('Dev') と書いたのであれば、ID 重複というエラーデータに対する操作ということになり、何が起こるか予測できない(だから、まず HTML を修正しろと言ったわけで)。

今現在どんなコードになっているか分からないと、何ともアドバイスしかねます。

6   名前: まゆぷ : 2007/06/26(火) 02:01  ID:Iawx9Uxp sub-y8
VBは少しだけ経験ありです。
スペルミスをなおして、Trueをtrueに変更してやってみましたが
frmPtSlの中のラジオボタンが初期化されませんでした。
下記のコードでテーブル表示切替まではうまく動作しています。

<script language="javascript">
<!--
function ChangeDevTable(chkOBJ){
var n=document.frmDev.Dev.length - 0;
var j=chkOBJ.value;
if(chkOBJ.checked){
for(i=0;n>i;i++){
var k="Dev"+i;
document.getElementById(k).style.display="none";
}
document.getElementById(j).style.display="block";
//初期化
if(j=="Dev1"){
document.getElementById("sec0").style.display="block";
}
else{
document.getElementById("sec0").style.display="none";
document.getElementById("sec1").style.display="none";
}
}
}


function ChangePtSlTable(chkOBJ){
var p=document.frmPtSl.section.length - 0;
var r=chkOBJ.value;
if(chkOBJ.checked){
for(i=0;p>i;i++){
var s="sec"+i;
document.getElementById(s).style.display="none";
}
document.getElementById(r).style.display="block";
}
}
//-->
</script>


★関数使用部分★
<form name="frmDev">
<fieldset>
<input type="radio" name="Dev" value="Dev0" onClick="ChangeDevTable(this);" checked>ラジオボタン1
<input type="radio" name="Dev" value="Dev1" onClick="ChangeDevTable(this);">ラジオボタン2
<input type="radio" name="Dev" value="Dev2" onClick="ChangeDevTable(this);">ラジオボタン3
<input type="radio" name="Dev" value="Dev3" onClick="ChangeDevTable(this);">ラジオボタン4
</fieldset>
</form>


★ラジオボタン1のときにこのテーブルを表示する
<table cellspacing="0" cellpadding="0" id="Dev0" style="display:block;">
<tr>
<td>(省略)</td>
</tr>
</table>


★ラジオボタン2のときにこのテーブルを表示する
<table cellspacing="0" cellpadding="0" width="680" id="Dev1" style="display:none;">
<tr>
<td>(省略)</td>
<td>
<form name="frmPtSl">
<fieldset>
<input type="radio" name="section" value="sec0" onClick="ChangePtSlTable(this);" checked>切替後ラジオボタン1<br>
<input type="radio" name="section" value="sec1" onClick="ChangePtSlTable(this);">切替後ラジオボタン2
</fieldset>
</form>
</td>
</tr>
</table>


★ラジオボタン3のときにこのテーブルを表示する
<table cellspacing="0" cellpadding="0" id="Dev2" style="display:block;">
<tr>
<td>(省略)</td>
</tr>
</table>


★ラジオボタン4のときにこのテーブルを表示する
<table cellspacing="0" cellpadding="0" id="Dev3" style="display:block;">
<tr>
<td>(省略)</td>
</tr>
</table>

7   名前: 匿名 : 2007/06/26(火) 02:01  ID:ey/iH1GD sub-Cz
なぜ強調部分のように修正するのかをリファレンスで確認して下さい。
<form action="#">
  <fieldset>
    <legend>グループ名</legend>
    <input type="radio" name="Dev" value="Dev0" onclick="ChangeDevTable(this);" checked>ラジオボタン1
    <input type="radio" name="Dev" value="Dev1" onclick="ChangeDevTable(this);">ラジオボタン2
    <input type="radio" name="Dev" value="Dev2" onclick="ChangeDevTable(this);">ラジオボタン3
    <input type="radio" name="Dev" value="Dev3" onclick="ChangeDevTable(this);">ラジオボタン4
  </fieldset>
</form>
<table id="Dev1" summary="">
  <tr>
    <td>
      <form action="#" id="frmPtSl1"><!-- id="formPtSl0", "formPtSl2", etc. -->
        <fieldset>
          <legend>グループ名</legend>
          <input type="radio" name="section" value="sec0" onclick="ChangeDevTable(this);" checked>切替後ラジオボタン1<br>
          <input type="radio" name="section" value="sec1" onClick="ChangeDevTable(this);">切替後ラジオボタン2
        </fieldset>
      </form>
    </td>
  </tr>
</table> 
<style type="text/css">

#Dev1, #Dev2, #Dev3 { display: none; }

</style>
<script type="text/javascript">

function ChangeDevTable (radio) {
    var radioGroup = radio.form.elements[radio.name];
    var table, form;
    for (var i = 0, I = radioGroup.length; i < I; i++) {
        table = document.getElementById (radioGroup[i].value);
        form = document.getElementById ('PtSl' + i);
        if (! radioGroup[i].checked) {
            table.style.display = 'none';
            form.reset ();
        } else {
            table.style.display = 'block';
        }
    }
}

</script>

# sec0、sec1 という id を持つ要素が見当たらず、Dev0 と sec0 の関係も不明だが、とりあえずそのまま残した。

8   名前: 匿名 : 2007/06/26(火) 02:01  ID:Qlp3w3H/ sub-Cz
ごめんなさい、>>7 は ID 指定にミスがあった('PtSl' + i → 'frmPtSl' + i)。

あと、いちいちラジオボタンに onclick を振るのも馬鹿馬鹿しいので、フォームをオブザーバにした方が良いかもしれないと思った。どういう連係構造でどこまでリセットするのか分からないので、とりあえず直近のフォームのみリセット。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<title>TEST</title>
<style type="text/css">

#Dev0, #Dev1,
#Sec0, #Sec1 { display: none; }

</style>
<script type="text/javascript">

function changeDevTable (evt) {
    var target = evt.target || evt.srcElement;
    if (target.nodeName == 'INPUT' && target.type == 'radio') {
        var radios = target.form.elements[target.name];
        var radio, table, form;
        for (var i = 0, I = radios.length; i < I; i++) {
            radio = radios[i];
            table = document.getElementById (radio.value);
            form  = document.getElementById (radio.value + '-frmPtSl');
            if (radios[i] == target) {
                table.style.display = 'block';
            } else {
                table.style.display = 'none';
                form.reset ();
            }
        }
    }
}
</script>

<!--==================== Control Panel ====================-->
<form action="#" onclick="changeDevTable (event); ">
  <p>
    <input type="radio" name="Dev" value="Dev0" checked="checked">Dev0
    <input type="radio" name="Dev" value="Dev1">Dev1
  </p>
</form>

<!--==================== Table Group: "Dev" ====================-->
<table summary="" id="Dev0">
  <tr>
    <td>
      <form action="#" id="Dev0-frmPtSl" onclick="changeDevTable (event); ">
        <fieldset>
          <legend>Dev0</legend>
          <input type="radio" name="Sec" value="Sec0" checked="checked">Sec0
          <input type="radio" name="Sec" value="Sec1">Sec1
        </fieldset>
      </form>
    </td>
  </tr>
</table>
<table summary="" id="Dev1">
  <tr>
    <td>
      <form action="#" id="Dev1-frmPtSl" onclick="changeDevTable (event); ">
        <fieldset>
          <legend>Dev1</legend>
          <input type="radio" name="Sec" value="Sec0" checked="checked">Sec0
          <input type="radio" name="Sec" value="Sec1">Sec1
        </fieldset>
      </form>
    </td>
  </tr>
</table>

<!--==================== Table Group: "Sec" ====================-->
<table summary="" id="Sec0">
  <tr>
    <td>
      <form action="#" id="Sec0-frmPtSl">
        <fieldset>
          <legend>Sec0</legend>
          <input type="radio" name="dummy" checked="checked">Dm0
          <input type="radio" name="dummy">Dm1
        </fieldset>
      </form>
    </td>
  </tr>
</table>
<table summary="" id="Sec1">
  <tr>
    <td>
      <form action="#" id="Sec1-frmPtSl">
        <fieldset>
          <legend>Sec1</legend>
          <input type="radio" name="dummy" checked="checked">Dm2
          <input type="radio" name="dummy">Dm3
        </fieldset>
      </form>
    </td>
  </tr>
</table>

一覧へ戻る