前回の記事で、JavaScriptを用いて動的に要素をコピーし追加する方法について書きましたが、
単純に要素をコピーするだけだと、セレクトメニューの場合は上手くいきません。
セレクトメニューで値を選択し、その状態で要素を追加しても

このように、セレクトメニューだけは、値がデフォルトのままとなってしまいます。

セレクトメニューの場合は、コードの中に、値の部分も明示的にコピーする処理を付け加えておく必要があるわけです。
セレクトメニューの値を取得する
コピー元のセレクトメニューの値は、selectedIndex メソッドで取得できます。
今回の場合は、次のようなコードで取得可能です。
let val = elements.lastElementChild.firstElementChild.selectedIndex;
セレクトメニューの値を入れ替える
上記で取得しておいた、コピー元のセレクトメニューの値を、コピー先のセレクトメニューの値としてセットしておきます。
同じく selectedIndex メソッドでセットできます。
copied.firstElementChild.selectedIndex = val;
サンプルコード
追加した処理を含め、今回のサンプルコードはこのようになります。
<html>
<body>
<button id="add">Add!</button>
<div id="target">
<div>
<select>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<input type="text">
<input type="checkbox">
<button>here</button>
</div>
</div>
<script type="text/javascript">
// 要素をコピー&追加する関数
function addExample() {
let elements = document.getElementById("target");
let copied = elements.lastElementChild.cloneNode(true);
// 1. セレクトメニューの値を取得する
let val = elements.lastElementChild.firstElementChild.selectedIndex;
// 2. コピー先のセレクトメニューの値を、1で取得しておいた値と入れ替える
copied.firstElementChild.selectedIndex = val;
elements.appendChild(copied);
}
// ボタンにイベントハンドラをセット
const btn = document.getElementById("add");
btn.addEventListener("click", addExample, false);
</script>
</body>
</html>
上記の処理を追加することで、選択したセレクトボックスの値も

無事にコピーすることができました。

