<!DOCTYPE html>
<html lang='ja'>
<head>
<title>JavaScript テスト</title>
</head>
<body>
<form name="selbox">
<p>好きなリーグは?</p>
<select name="league" onchange="teamSet()">
<option value="">リーグ選択</option>
<option value="">プレミアリーグ</option>
<option value="">リーガエスパニョーラ</option>
<option value="">ブンデスリーガー</option>
<option value="">セリエA</option>
<option value="">リーグ1</option>
</select>
<p>好きなチームは?</p>
<select name="team">
<option value="">チーム選択</option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
<option value=""></option>
</select>
<script>
var UK_league=new Array("","アーセナル","チェルシー","マンチェスターU","マンチェスターC","リバプール","トッテナム");
var SP_league=new Array("","バルセロナ","レアルマドリー","アトレティコマドリー","セビージャ","ビジャレアル","バレンシア");
var GE_league=new Array("","Bミュンヘン","ドルトムント","シャルケ04","フランクフルト","ヘルタベルリン","")
var IT_league=new Array("","ユベントス","インテル","ACミラン","ローマ","フィレオンティーナ","ラツィオ")
var FR_league=new Array("","PSG","","","","","")
function teamSet(){
for(i=1;i<7;i++){
switch(document.selbox.league.selectedIndex){
case 0: document.selbox.team.options [i].text="";break;
case 1: document.selbox.team.options [i].text=UK_league[i];break;
case 2: document.selbox.team.options [i].text=SP_league[i];break;
case 3: document.selbox.team.options [i].text=GE_league[i];break;
case 4: document.selbox.team.options [i].text=IT_league[i];break;
case 5: document.selbox.team.options [i].text=FR_league[i];break;
}
}
document.selbox.team.selectedIndex=0;
}
</script>
</form>
</body>
</html>
リーグを選ぶ⇒そのリーグのチームを選ぶ⇒そのチームの選手を選ぶ
を作成しています。チームを選ぶところまではできたのですが、そこから選手を選ぶプログラムを打ちたいのですが、できません。
1つのチームでいいのでどなたか教えてください
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
こそっと、書いてみた。
連動させたいselect要素には同じclassを指定。
selectedさせたいoption要素にはclass="selected"をつける
初代の親には普通にselected
各select要素のクローンを作り、子孫関係を紐付ける
親のselect要素の値から、子クローンのoptgroupを子にコピーする
みたいな・・・。
<!DOCTYPE html>
<meta charset="utf-8">
<title>SELECT要素の連動</title>
<style>
body {
color: white;
background: black;
}
</style>
<body>
<form id="SELECT_TEST">
<p>
<label>Group:</label>
<select name="group" class="selectA">
<option value="GroupA">GROUP A</option>
<option value="GroupB">GROUP B</option>
</select>
<label>Team:</label>
<select name="team" class="selectA">
<optgroup label="GroupA">
<option value="TeamA">TEAM A</option>
<option value="TeamB">TEAM B</option>
</optgroup>
<optgroup label="GroupB">
<option value="TeamC">TEAM C</option>
<option value="TeamD">TEAM D</option>
</optgroup>
</select>
<label>Player:</label>
<select name="player" class="selectA">
<optgroup label="TeamA">
<option value="PlayerA">PLAYER A</option>
<option value="PlayerB">PLAYER B</option>
</optgroup>
<optgroup label="TeamB">
<option value="PlayerC">PLAYER C</option>
<option value="PlayerD">PLAYER D</option>
</optgroup>
<optgroup label="TeamC">
<option value="PlayerE">PLAYER E</option>
<option value="PlayerF">PLAYER F</option>
</optgroup>
<optgroup label="TeamD">
<option value="PlayerG">PLAYER G</option>
<option value="PlayerH">PLAYER H</option>
</optgroup>
</select>
</p>
<script>
(function (D) {
function toAry (nodeList) {
return Array.prototype.slice.call (nodeList);
}
function append (e) {
this.insertBefore (e, this.firstChild);
}
function remove (e) {
this.removeChild (e);
}
function replace (e, n) {
toAry (e.querySelectorAll ('optgroup')).forEach (remove, e);
e.appendChild (n);
}
//______
function ESelect (select) {
this.eSelect = select;
this.cSelect = select.cloneNode (true);
}
function getVal (select) {
return select.options[select.selectedIndex].value;
}
function replaceGroup (label) {
var s, e;
var g = this.cSelect.querySelector (label
? 'optgroup[label="' + label + '"]'
: 'optgroup:first-of-type');
if (g) {
replace (e = this.eSelect, g.cloneNode (true));
s = e.querySelector ('option[class^="selected"]') ||
e.querySelector ('option:first-of-type');
if (s)
s.selected = true;
}
else
toAry (this.cSelect.querySelectorAll ('optgroup'))
.reverse ()
.forEach (append, e);
}
//______
ESelect.prototype.replaceGroup = replaceGroup;
ESelect.prototype.getVal = getVal;
//______
function selectChangeHandle (event) {
var e = event.target;
var n, t;
while (-1 < (n = this.selectBuffer.indexOf (e))) {
t = this.cloneBuffer[n];
t.replaceGroup (getVal (e));
e = t.eSelect;
}
}
function init (select) {
var buf = { }, begin = [ ];
var i, s, e, n;
for (i = 0; s = select[i]; i += 1) {
if ((n = s.className)) {
if (e = buf[n]) {
e.addEventListener ('change', this, false);
this.selectBuffer.push (e);
this.cloneBuffer.push (new ESelect (s));
buf[n] = s;
}
else
begin.push (buf[n] = s);
}
}
begin.forEach (function (select) {
selectChangeHandle.call (this, { target: select });
}, this);
}
//______
var Interlock = new Object;
Interlock.handleEvent = selectChangeHandle;
Interlock.selectBuffer = [ ];
Interlock.cloneBuffer = [ ];
init.call (Interlock, D.querySelectorAll ('select'));
}) (document);
</script>
No.3
- 回答日時:
リーグとチームと選手と、ついでに選手詳細が連動するサンプル
<!DOCTYPE html><meta charset=utf-8>
<form name=alpha>
<p> <select name=league></select>
<p> <select name=team></select>
<p> <select name=member></select>
<p> <output name=detail></output>
</form>
<script>(function(W,D,_){
var leagues = [
{ value:'A', name:'江戸', teams:[
{ value:'A1', name:'宗家', members:[ 'A1a:徳川秀忠', 'A1b:徳川家光', 'A1c:徳川綱吉' ] },
{ value:'A2', name:'紀伊', members:[ 'A2a:徳川吉宗', 'A2b:徳川家治', 'A2c:徳川家慶' ] },
{ value:'A3', name:'水戸', members:[ 'A3a:徳川光圀', 'A3b:一橋慶喜' ] },
]},
{ value:'B', name:'三国', teams:[
{ value:'B0', name:'後漢', members:[ 'B0a:劉宏', 'B0b:劉協' ] },
{ value:'B1', name:'曹魏', members:[ 'B1a:曹操', 'B1b:曹丕', 'B1c:曹植' ] },
{ value:'B2', name:'孫呉', members:[ 'B2a:孫堅', 'B2b:孫策', 'B2c:孫権' ] },
{ value:'B3', name:'蜀漢', members:[ 'B3a:劉備', 'B3b:劉禅' ] },
]},
{ value:'C', name:'ローマ', teams:[
{ value:'C1', name:'Julio', members:[ 'C1a:Caesar', 'C1b:Augustus', 'C1c:Tiberius' ] },
{ value:'C2', name:'Flavian', members:[ 'C2a:Vespasianus', 'C2b:Domitianus' ] },
]},
];
function R(d,s){ if (s) for (var i in s) d[i] = s[i]; return d; }
function E(p,n,o){ return p.appendChild(R(D.createElement(n),o)); }
function F(a,v){ for (var i = 0; i < a.length; i++) if (typeof a[i] == 'string' && a[i].startsWith(v) || a[i].value == v) return a[i]; }
D.addEventListener('DOMContentLoaded', function(){
_ ; var setOptions = function(sel, a, m) {
_ ; _ ; while (sel.lastChild) sel.removeChild(sel.lastChild);
_ ; _ ; if (!a) return;
_ ; _ ; E(sel,'option', {textContent:m? m: '[please choice]'});
_ ; _ ; a.forEach(function(d){
_ ; _ ; _ ; var v = (typeof d == 'string')? v = d.split(':'): [ d.value, d.name ];
_ ; _ ; _ ; E(sel,'option', {value:v[0], textContent:v[1]});
_ ; _ ; });
_ ; };
_ ; var form = D.forms['alpha'];
_ ; var sl = form.elements['league'];
_ ; var st = form.elements['team'];
_ ; var sm = form.elements['member'];
_ ; var od = form.elements['detail'];
_ ; setOptions(sl, leagues);
_ ; setOptions(st, null);
_ ; setOptions(sm, null);
_ ; sl.addEventListener('change', function(ev){
_ ; _ ; var lv = ev.target.value;
_ ; _ ; var league = F(leagues, lv);
_ ; _ ; setOptions(st, league? league.teams: null);
_ ; _ ; setOptions(sm, null);
_ ; _ ; od.value = '';
_ ; }, false);
_ ; st.addEventListener('change', function(ev){
_ ; _ ; var lv = sl.value, tv = ev.target.value;
_ ; _ ; var team = F(F(leagues, lv).teams, tv);
_ ; _ ; setOptions(sm, team? team.members: null, '[詳細を表示する選手]');
_ ; _ ; od.value = '';
_ ; }, false);
_ ; sm.addEventListener('change', function(ev){
_ ; _ ; var lv = sl.value, tv = st.value, mv = ev.target.value;
_ ; _ ; var member = F(F(F(leagues, lv).teams, tv).members, mv);
_ ; _ ; od.value = member? member + 'についての詳細': '';
_ ; }, false);
}, false);
})(window, document)</script>
No.2
- 回答日時:
この手の処理はデータはサーバー側でデータベースで管理し
条件に応じてajaxでデータを取りに行くというのが賢明です。
もしDBの導入が難しいようであれば、チームごとかリーグごとに
ファイルをつくり選手名をリストにして取り出せるようにするとよいでしょう
No.1
- 回答日時:
こんにちは
想像するところ、データ数がネズミ算式に増えていくので、それをどうするかのほうが問題のような気がします。
セレクトボックスで選択内容に応じて選択肢を連動なさりたいのだと思いますが、データ量の問題を置いておけば、セレクトボックスを制御する例は検索すればたくさん見つかることと思います。
例えば、
http://d.hatena.ne.jp/Mars/20071109
http://www.skuare.net/test/jdependent.html
一方で、データ数がかなり多く、選択しながら範囲を狭めていくようなもので、例えば、駅名検索や住所検索などで選択肢を表示してくれるタイプのものの場合、事前に全てのデータをページ上に用意するのは合理的ではないので(無駄になるデータがほとんど)、別の方法がとられていることが多いと思います。
(全データを保持しているサーバと送受信しながら、必要な内容を表示してゆく方法)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 以前の質問だと、どの条件でも配列が表示されてしまいます。 1 2022/07/09 11:40
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- JavaScript セレクトボックスを2つ選択してメッセージなどを表示するには。~運賃検索プログラムを完成させたい~ 1 2022/07/22 11:10
- JavaScript セレクトボックスで配列を呼び出したい。 1 2022/07/08 20:14
- JavaScript 2段階プルダウンで1段階目の選択を終えた後に選択ボックスを見えなくしたい 2 2022/07/05 21:58
- JavaScript console.logがどうしても2つ機能しないのでアドバイスをくださいお願いします 2 2022/07/07 22:13
- JavaScript JavascriptからSQLへ繋ぎ方が分からない 3 2022/07/07 00:27
- JavaScript 中百舌鳥駅と深井駅を入れ替えて選択しても同じ挙動にしたいです。 2 2022/06/24 18:45
- JavaScript 電車の運賃を出すプログラムを作っています。 2 2022/06/22 09:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
リストボックス内の重複したも...
-
全てのselect要素をデフォルト...
-
javascriptでセレクトボックス...
-
プルダウン選択を変更すると、...
-
サイト内の物件を複数の検索条...
-
select要素のvalueを配列で取得...
-
時間の選択に関して
-
VBScriptでHTMLのセレクトボッ...
-
【javascript】連想配列からセ...
-
二つのセレクトボックス間での...
-
セレクトメニューの値をクッキ...
-
セレクトボックスで配列を呼び...
-
プルダウンの値によって活性・...
-
Selectボックスの一覧表示方法
-
プルダウンの値をphpファイルへ...
-
selectのnameが配列の場合
-
selectを変更不可にしたい
-
同一ページに複数のプルダウン...
-
ラジオボタンの選択に応じてプ...
-
document.writeでセレクトボッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プルダウン選択を変更すると、...
-
全てのselect要素をデフォルト...
-
【JS】selectでchangeした時の...
-
javascriptでセレクトボックス...
-
Selectボックスの一覧表示方法
-
複数のプルダウンを1つにまとめ...
-
コードレビューをお願いします。
-
JavaScriptで<select>の<option...
-
<input>の選択肢をプルダウンメ...
-
select要素のvalueを配列で取得...
-
selectを変更不可にしたい
-
VBScriptでHTMLのセレクトボッ...
-
ラジオボタンとプルダウンを連...
-
javascriptで合計金額を算出し...
-
中百舌鳥駅と深井駅を入れ替え...
-
同じ名前のセレクトがある場合...
-
セレクトボックスで配列を呼び...
-
今日の日付を自動的にセレクト...
-
プルダウンの値によって活性・...
-
サイト内の物件を複数の検索条...
おすすめ情報