【JavaScript】selectタグのoptionを選択した時にselected属性を付与する
タイトルの通り、selectタグのoptionを選択した時に、そのoptionタグにselected属性を付与する方法を紹介します。
この記事を書いたきっかけ
selectタグのoptionの初期値を設定するには、optionタグにselected属性を付与します。
しかし、このselected属性は、サイト上で他の選択肢を選択しても移動しません。
つまり、何を選択してもselected属性はHTMLファイルで定義したoptionタグに付いたままです。
(デベロッパーツールでselectタグの中を見てみると一目瞭然です)
この挙動により何が生じるかというと、例えば、以下のような処理を行いたいとします。
- ボタンをクリックするとselectタグを複製して表示させる
- 選択肢が変わっていたら、複製先にもそれを反映させること
セレクトボックスの初期値から違う値を選択した状態でselectタグを複製すると、複製先の見た目はselected属性が付いた選択肢が表示されてしまいます。
つまり、初期値が「A」のセレクトボックスで「B」を選択、その後複製して表示させると「A」が選択された状態になってしまいます。(期待値は「B」が選択された状態ですね)
これの対処法が、「セレクトボックスの選択肢を選択するたびに、selected属性を動的にjsで移動させる」になります。
サンプルコード
Codepenに動作確認できるコードを用意しました。
See the Pen
【JavaScript】selectタグのoptionを選択した時にselected属性を付与する by dadada (@dadada-dadada)
on CodePen.
解説
処理自体はとてもシンプルです。
const setOptionSelected = (_select) => {
const elmOptions = Array.from(_select.children);
elmOptions.forEach(_option => {
if (_option.hasAttribute('selected')) _option.removeAttribute('selected');
});
elmOptions[_select.selectedIndex].setAttribute('selected', '');
};
この関数は、optionタグのselected属性を一旦削除して、その後選択したoptionタグにselected属性を付与しています。
const elmSelects = [...document.querySelectorAll('.setOptionSelected')];
elmSelects.forEach(_elmSelect => {
_elmSelect.addEventListener("change", () => {
setOptionSelected(_elmSelect);
});
});
先程の関数を、.setOptionSelectedclassを付与している要素の値が変わったタイミングで実行しています。