アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつも参考にさせて頂いております。
javascript初心者です。
現在、javascriptにてセレクトメニューの4連動を作成しているのですが、4つ目のセレクトメニューを正常に動かすことが出来ません・・・。何とか3つまでは動くようになったのですが・・・。忙しいところを申し訳ありませんが、教えて下さい。

一つ目のセレクトで、地域の選択
二つ目のセレクトで、県の選択
三つ目のセレクトで、「プレイスポット」か「食事」の選択
四つ目のセレクトでは、
プレイスポット名(三つ目でプレイスポット選択時)
お店名(三つ目で食事選択時)
上記したようにしたいのです。宜しくお願いします。


<html>
<head>
<script type="text/javascript">
<!--

var area=0;

function setA(n)
{
aa=n;

data1 =
[
["東京","神奈川"],
["大阪","神戸"],
];

len = document.form1.box_a.options.length;

for(i=len-1; i>0; --i)
document.form1.box_a.options[i] = null;
if(n!=0)
{
document.form1.box_a.style.visibility = "visible";

for(i=0; i<data1[n-1].length; i++)
document.form1.box_a.options[i+1] = new Option(data1[n-1][i]);
}
setB(0);
}

function setB(n)
{
data2 =
[
[["プレイスポット","食事"],["プレイスポット","食事"]],
[["プレイスポット","食事"],["プレイスポット","食事"]]
];

len = document.form1.box_b.options.length;

for(i=len-1; i>0; --i)
document.form1.box_b.options[i] = null;

if(n==0)return;
document.form1.box_b.style.visibility = "visible";

for(i=0; i<data2[aa-1][n-1].length; i++)
document.form1.box_b.options[i+1] = new Option(data2[aa-1][n-1][i]);
setC(0);
}

function setC(n)
{
data3 =
[
[[["としまえん","よみうりランド"],["キハチ","久兵衛"]]],
[[["江ノ島","鎌倉"],["カレーミュージアム","中華街"]]],
[[["ユニバーサルスタジオ","天王寺動物園"],["かに道楽","金龍ラーメン"]]],
[[["須磨海浜水族園","グリコピア"],["コンチェルト","六甲山牧場"]]]
];

len = document.form1.box_c.options.length;

for(i=len-1; i>0; --i)
document.form1.box_c.options[i] = null;

if(n==0)return;
document.form1.box_c.style.visibility = "visible";

for(i=0; i<data3[aa-1][n-1][n-1].length; i++)
document.form1.box_c.options[i+1] = new Option(data3[aa-1][n-1][n-1][i]);
}
//-->
</script>
</head>
<body>
<form name="form1">
<select name="sel1" onChange="setA(this.selectedIndex)">
<option value="0" selected>▼選択してください</option>
<option value="1">関東</option>
<option value="2">関西</option>
</select>
<select name="box_a" onChange="setB(this.selectedIndex)"><option value="0" selected>---------------</option></select>
<select name="box_b" onChange="setC(this.selectedIndex)"><option value="0" selected>---------------</option></select>
<select name="box_c" onChange=""><option value="0" selected>---------------</option></select>
</form>
</body>
</html>

A 回答 (4件)

データ構造がわかりにくい・・・


最終的に必要なのは4番目のセレクトメニューだけですよね?
ならいっそのことこんなかんじでどうでしょ?

<html>
<head>
<style>
select{
width:150px;
}
</style>
<script>
var data={
関東:{
東京:{
プレイスポット:{0:"としまえん",1:"よみうりランド"}
,食事:{0:"キハチ",1:"久兵衛"}
}
,神奈川:{
プレイスポット:{0:"江ノ島",1:"鎌倉"}
,食事:{0:"カレーミュージアム",1:"中華街"}
}
}
,関西:{
大阪:{
プレイスポット:{0:"ユニバーサルスタジオ",1:"天王寺動物園"}
,食事:{0:"かに道楽",1:"金龍ラーメン"}
}
,神戸:{
プレイスポット:{0:"須磨海浜水族園",1:"グリコピア"}
,食事:{0:"コンチェルト",1:"六甲山牧場"}
}
}
};
window.onload=function(){
s0=document.getElementById("s0");
s1=document.getElementById("s1");
s2=document.getElementById("s2");
s3=document.getElementById("s3");
setSelect(data,s0);
s0.onchange=function(){
clearSelect(s2);
clearSelect(s3);
if(this.value==""){
clearSelect(s1);
}else{
setSelect(data[this.value],s1);
}
}
s1.onchange=function(){
clearSelect(s3);
if(this.value==""){
clearSelect(s2);
}else{
setSelect(data[s0.value][this.value],s2);
}
}
s2.onchange=function(){
if(this.value==""){
clearSelect(s3);
}else{
setSelect(data[s0.value][s1.value][this.value],s3);
}
}
}
function setSelect(obj,sel){
while(lc=sel.lastChild){
sel.removeChild(lc);
};
var op=document.createElement("option");
op.setAttribute("value","");
op.appendChild(document.createTextNode("▼選択してください"));
sel.appendChild(op);
for(var i in obj){
var txt=(typeof obj[i]=="object")?i:obj[i];
var op=document.createElement("option");
op.setAttribute("value",i);
op.appendChild(document.createTextNode(txt));
sel.appendChild(op);
}
}
function clearSelect(sel){
while(lc=sel.lastChild){
sel.removeChild(lc);
};
var op=document.createElement("option");
op.appendChild(document.createTextNode("---------------"));
sel.appendChild(op);
};


</script>
</head>
<body>
<form id="f0">
<select id="s0">
<option value="">▼選択してください</option>
</select>
<select id="s1">
<option value="">---------------</option>
</select>
<select id="s2">
<option value="">---------------</option>
</select>
<select id="s3" name="place">
<option value="">---------------</option>
</select>
</form>
</body>
</html>
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
すごく参考になります。
ありがとうございました。
では、失礼します。

お礼日時:2008/05/04 11:07

「訂正」最後のfor文も同じくbbを使います。

今は数が同じだからそのままでも動きました。
for(i=0; i<data3[aa-1][bb-1][n-1].length; i++)
    • good
    • 0

・ 配列がむやみに複雑になっていて改良の余地があると思いますが、とりあえず修正点を挙げてみます。



・ setA(n)のaa=n;と同じように、setB(n)にbb=n; を加えます。それを、setC(n)の
document.form1.box_c.options[i+1] = new Option(data3[aa-1][bb-1][n-1][i]);
で利用します。

・ 配列data3の構造を変えます。

以下のコードを参考にしてみてください。
------------------------------------------------------------
function setB(n)
{
bb=n;
data2 =
------------------------------------------------------------

function setC(n)
{
data3 =
[
[
[["としまえん","よみうりランド"],["キハチ","久兵衛"]],
[["江ノ島","鎌倉"],["カレーミュージアム","中華街"]]
],
[
[["ユニバーサルスタジオ","天王寺動物園"],["かに道楽","金龍ラーメン"]],
[["須磨海浜水族園","グリコピア"],["コンチェルト","六甲山牧場"]]
]
];

len = document.form1.box_c.options.length;

for(i=len-1; i>0; --i)
document.form1.box_c.options[i] = null;

if(n==0)return;
document.form1.box_c.style.visibility = "visible";

for(i=0; i<data3[aa-1][n-1][n-1].length; i++)
document.form1.box_c.options[i+1] = new Option(data3[aa-1][bb-1][n-1][i]);
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
理想のものになりました!!
本当に助かりました。
では、失礼します。

お礼日時:2008/05/03 11:38

> [[["としまえん","よみうりランド"],["キハチ","久兵衛"]]],


なんで二重に括られているのかがよくわからないんだけど・・・?
[]が ひと組余分に見えるのは気のせい?
    • good
    • 0
この回答へのお礼

ご指摘ありがとうございます。
初心者でよくわかってませんでした。
もっと理解してきます。

お礼日時:2008/05/03 11:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!