JavaScriptでプルダウンメニューを複数連動させるなるべく簡単な方法 JavaScript 7 2020/07/22 (更新日:2020/07/22) 1つのプルダウンを変更したら、その内容に連動して別のプルダウンを変更するという使い古された手法のお話。 ちょっと検索すればJavaScriptのサンプルが山ほど出てくるかと思いますが、ハードコーディングが多すぎていまいち汎用的ではなかったり、モダンブラウザ全盛の昨今、あまり使いたくないjQueryが前提だったりするため、あらためて投稿しておこうかなぁ、と思い立ち記事を書いています。 コンセプトとしては「jQuery不要」で「そこそこ汎用性がある」書き方にしたつもりです。 プルダウンを連動させるサンプル 実行例 1つ目のプルダウンでOSを選択すると、2つ目のプルダウンにはOSに応じたバージョンが出てくる仕組みです。 OSを選択 Windows Android iOS JavaScriptサンプル <select name="OS"> <option value="">OSを選択</option> <option value="Windows">Windows</option> <option value="Android">Android</option> <option value="iOS">iOS</option> <select> <select name="version"> </select> <script> let versionArray = new Array(); versionArray[''] = new Array('バージョン情報'); versionArray['Windows'] = new Array('XP', 'Vista', '7', '8', '8.1', '10'); versionArray['Android'] = new Array('7 (Nougat)', '8 (Oreo)', '9 (Pie)', '10'); versionArray['iOS'] = new Array('10以下', '11', '12', '13'); document.getElementsByName('OS')[0].onchange = function () { let os = this.value; let elm = document.getElementsByName('version')[0]; elm.options.length = 0; for (let i = 0; i < versionArray[os].length; i++) { let op = document.createElement('option'); op.value = versionArray[os][i]; op.textContent = versionArray[os][i]; elm.appendChild(op); } }; window.onload = function () { document.getElementsByName('OS')[0].onchange(); }; </script> 解説 なるべくシンプル、かつ汎用的にしたつもりですが、どうでしょうかね。 プルダウンの連動はいろんなやり方がありますし、たとえばHTMLタグでの見栄えを重視するなら、バージョン情報のselectタグを複数用意しておき、OSプルダウンが変更されるたびにstyleのdisplay:none;とdisplay:block;を切り替える、なんてのもアリでしょう。 ただ、その場合、selectのname属性が重複してしまうので、GETやPOSTする予定の場合は使いづらくなっちゃいますかね。 そんなわけで、今回はJavaScript内にversionArrayという連想配列を用意し、そこに2つ目のプルダウン情報を書く、という方法にしてみました。 こうして変数を一箇所にまとめておけばメンテナンスが楽ですし、将来的にPHPなどのサーバーサイドスクリプトと連動させる場合にも便利です。 例えばPHPからJavaScriptのコードを出力するのも簡単ですし、より柔軟かつ大量のデータを想定しているなら、XMLHttpRequestでPHPに接続し、JSON形式XML形式でプルダウンのデータを返すことで、リアルタイムにサーバー上のデータを反映する、なんてことも可能でしょう。Ajaxと言ったほうがわかりやすいかな? ただ、正直言うと見やすさを重視して中途半端でもあります。 だって、せっかくversionArrayにプルダウン情報がすべてまとまっているのだから、1つ目のプルダウンもversionArrayを基にJavaScriptで出力したほうがより一層無駄がないですよね。 でもそうするとJavaScriptコードが長くなって、ウッとなる方もいるかもなので、やや中途半端ですが、見やすさとメンテンナス性のバランスを取ってみました。 まとめ JavaScriptでプルダウンを連動させるというサンプルはそこら中に転がっていますし、それだけ使われている手法でもあります。 しかしこのプルダウンの連動処理って、意外と前提知識が多く必要でして、 JavaScriptで連想配列を扱う方法 id属性ではなくname属性で要素を取得する方法 (getElementsByName) 動的に要素を生成する方法 (createElement) select要素の中身を空にする方法 (options.length = 0) 初回ロード時にselectのchangeイベントを発生させる方法 (window.onloadとonchange();の部分) というように、JavaScript初心者にとってはなかなか良い例題なんじゃないかなって、個人的には思っています。 先述したとおり、ここから更に発展させてサーバー側のDBからプルダウンのデータを引っ張ってくる、なんてことも可能ですしね。
JavaScriptでファイル名順に複数ファイルを読み込む方法INPUTタグで複数ファイルを読み込む際、ブラウザ内で処理するときはFileReaderオブジェクトを使うことが多いと思います。 しかしこれは非同期処理なので、はてファイル名順に処理する場合はど02024-06-13
JavaScriptのcanvasで縦書きを行う際の備忘録canvas上に縦書きの文章を出力して画像化しようと考えてちょっとハマったので忘れないうちにメモしておきます。 結論から先に書くと、基本的にcanvasにはwriting-modeの設定が効くの02024-06-11
JavaScriptのWebAudioAPIで楽曲の口パクをしてみる以前、ソフトウェアの解説動画を作った際、おっさんの声だけ流れてるのもアレだし、最近流行りのアバターにしゃべらせるやつやってみよう、と思ったことがあります。 vtuberとかおじさんよくわからない02023-11-20
jQuery不要なLightbox代替スクリプトLuminousが本当に軽量jQueryって…重いですよね。 各種ブラウザへの対応が面倒くさかった時代には本当にありがたかったのですが、モダンブラウザ全盛の今、jQueryの必要性を感じないことが多くなってきました。 02023-03-31
JavaScriptでcanvasを録画して動画ファイルに保存する方法前回の記事「JavaScriptで画像を連続表示してコマ撮りムービー風の表示をしてみる」では連続して画像を表示することで、コマ撮りムービーのようなものをブラウザ上に表示することに成功しました。 82023-01-24
Amazonアソシエイトのレポート作成とダウンロードを自動化するAmazonのアフィリエイトプログラムを使っている方ならわかってもらえると思いますが、Amazonアソシエイトページのレポート画面ってすっっっっっごく使いづらいですよね。 ページが重いのは良いん02022-03-18