ラジオボタンを切り替えた時にコンボボックスの選択肢を変えたい



0   名前: さちこ : 2007/03/14(水) 17:35  ID:pWZv8UkW sub-fy
はじめまして。HTMLタグすら勉強中の、JS超初心者です。

ラジオボタンで午前/午後を切り替えると、コンボボックスの選択肢を
午前の時は9:00〜12:00に、午後の時は13:00〜16:00に変更したいのですが
上手く出来ません。

どなたか、お知恵を貸していただけないでしょうか?
よろしくお願いいたします。

1   名前: 匿名 : 2007/03/14(水) 17:35  ID:Z/T9lFdK sub-kJ
現状どのようなソースコードになっており、どのようなエラーが生じているのか(あるいはどのような問題が生じているのか)、理想の形はどういうものか、詳細を希望。

# HTML「タグ」じゃなくて HTML そのものを勉強した方が良いよ(「タグ」の勉強にはスキーマの知識が必要)。

2   名前: さちこ : 2007/03/14(水) 17:35  ID:pWZv8UkW sub-fy
詳細を明記せずにスミマセンでした。現状はHTMLしかありません。
下記のような、ラジオボタンとコンボボックスの組み合わせです。

<input type="radio" name="ampm" value="0" checked>
<label for="am">午前</label>
<input type="radio" name="ampm" value="1">
<label for="pm">午後</label></span>

<select size="1" name="shh">
<option value="0" selected>--</option>
<option value="09">09</option>
<option value="10">10</option>
       <中略>
<option value="16">16</option></select>

<select size="1" name="smm">
<option value="0" selected>--</option>
<option value="00">00</option>
<option value="10">10</option>
       <中略>
<option value="50">50</option></select>

<select size="1" name="ehh">
<option value="0" selected>--</option>
<option value="09">09</option>
<option value="10">10</option>
       <中略>
<option value="16">16</option></select>

<select size="1" name="emm">
<option value="0" selected>--</option>
<option value="00">00</option>
<option value="10">10</option>
       <中略>
<option value="50">50</option></select>

このままですと、コンボボックスの選択肢は常に9:00〜16:00(10分刻み)となります。
それを、午前/午後のラジオボタンを選ぶ事によって表示される時間の範囲(shhとehhの選択肢)を
最初の質問に書きましたとおりに変更したいのです。
ラジオボタンのonClickを利用すればよいのかな???というレベルしか分からず、
JSの部分をどのように書けば実行できるのか、全く見当がつかない状況です。

ど素人の説明で判り辛いとは思いますが、どうかよいアドバイスをいただければと思います。
よろしくお願いいたします。

3   名前: 某制作さん : 2007/03/14(水) 17:35  ID:gFY2524F sub-Q5
<head>
<script type="text/javascript">
var values = new Array(new Array("--","0","1","2","3"),new Array("--","a","b","c","d"));
function changeSelectValue(Num){
for(var i=0; i<values[Num].length; i++){
document.forms[0].elements["ary"].options[i] = new Option(values[Num][i]);
}
}
</script>
</head>
<body onload="changeSelectValue(0);">
<form action="#">
<input type="radio" name="ap" value="AM" checked="checked" onclick="changeSelectValue(0);" />AM<br />
<input type="radio" name="ap" value="PM" onclick="changeSelectValue(1);" />PM<br />
<select name="ary">
</select>
</form>
</body>

こんな感じでどうでしょうか?
イメージしているものと同じかは分かりません。
速記で書いたものなので汎用性は低いですが
試してみてください。

ちなみに
通常はonclick部分はonchangeですが
IEで動作不良が起こったのでonclickにしてあります。

selectタグ内のオプションを変更する関数を書き
それをイベントハンドラonclickとonloadで実行しています。


きれいなソースでなくてすみませんが
以上です。
何かありましたら…

4   名前: 匿名 : 2007/03/14(水) 17:35  ID:Z/T9lFdK sub-kJ
考え方は >>3 と同じ。DOM1 の範囲で書いてみる。かえって面倒かもしれないが。
<form action="#">
  <script type="text/javascript">
/**
 * changeRange (form, value [[ name1, name2, ... ]]);
 * 
 * -form:  対象にする form 要素ノード(HTMLFormElement)。
 * -value: 09-12、13-16 のように、表示させたい時刻の範囲を - 区切りで指定した文字列(String)。
 * -name1, name2, ...: 適用させたい select 要素名(String)。数は任意。
 */
function changeRange (form, value) {
     var range = value.split ('-');
     var i = 2;
     var I = arguments.length;
     
     while (i < I) {
         var name = arguments[i++];
         var select = form.elements[name];
         while (select.hasChildNodes ()) select.removeChild (select.firstChild);
         
         for (var j = range[0], J = range[1]; j <= J; j++) {
             var option = document.createElement ('option');
             option.value = j;
             option.appendChild (document.createTextNode (j));
             select.appendChild (option);
         }
     }
}
  </script>
  <p>
    <label>
      <input type="radio" name="ampm" value="09-12" checked onmouseup="changeRange (this.form, this.value, 'shh', 'ehh')">
      午前
    </label>
    <label>
      <input type="radio" name="ampm" value="13-16" onmouseup="changeRange (this.form, this.value, 'shh', 'ehh')">
      午後
    </label>
    <select name="shh">
      <option value="09">09</option>
      <option value="10">10</option>
      <option value="11">11</option>
      <option value="12">12</option>
      <option value="13">13</option>
      <option value="14">14</option>
      <option value="15">15</option>
      <option value="16">16</option>
    </select>
    <select name="ehh">
      <option value="09">09</option>
      <option value="10">10</option>
      <option value="11">11</option>
      <option value="12">12</option>
      <option value="13">13</option>
      <option value="14">14</option>
      <option value="15">15</option>
      <option value="16">16</option>
    </select>
  </p>
</form>

なお、Firefox、Opera なら option 要素の disabled 属性がちゃんと効くから、以下で十分。
<style type="text/css">
option[disabled] { display: none; }
</style>

<script type="application/javascript">

function changeRange (form, value) {
     var range = value.split ('-');
     
     Array.forEach (Array.slice (arguments, 2), function (name) {
         Array.forEach (form.elements[name].options, function (option) {
             var n = parseInt (option.value, 10);
             option.disabled = (n < range[0] || range[1] < n);
         } );
     } );
}
</script>

5   名前: さちこ : 2007/03/14(水) 17:35  ID:pWZv8UkW sub-fy
某制作さん様、匿名様、ありがとうございました!!!
イメージどおりのソースをいただけて本当に助かりました。
早速参考にさせていただきます!

また何かありましたらよろしくお願いいたします。

6   名前: 匿名 : 2007/03/14(水) 17:35  ID:Z/T9lFdK sub-kJ
うわーごめんなさいごめんなさい、>>4 はバグ持ち。
for (var j = range[0], J = range[1]; j <= J; j++) {
for (var j = parseInt (range[0], 10), J = parseInt (range[1], 10); j <= J; j++) {

cf. '07' <= '010'; // false

一覧へ戻る