HTMLで表示された入力フォームにて、ボタン押下で動的に、最後の要素をコピーして追加する機能を実装します。
このように、テキストボックス・チェックボックス・ボタンが並んだ要素を、

上段の「Add!」ボタンをクリックすることで、同じ要素が一行追加されます。

ただ追加するだけではなく、値もコピーすることにします。最終行に値を入力して「Add!」ボタンを押すと・・・

値もコピーされて、同じ要素が最下段に追加されます。

手順は次の通りです。
概要
やりたいことの概要を説明します。
id = “add” のボタン要素があり、その次に対象要素をコピー&追加していくdivエリア(id = “target”)が存在しています。

id = “add” のボタンをクリックすると、id = “target” の div 要素内に、その最後の子要素である div 要素をコピーし、

最下部に追加します。

要素の追加対象エリアを取得
要素を追加する対象エリアを取得します。上の構成で言うと、id = “target” の div 要素が該当します。
document.getElementById メソッドで取得可能です。
let elements = document.getElementById("target");
対象要素をコピー
コピー対象の要素を、cloneNode メソッドでコピーします。
今回は、id = “target” の div エリアにおける最後の子要素をコピーするため、lastElementChild メソッドを使用します。
let copied = elements.lastElementChild.cloneNode(true);
コピーした要素を追加
最後に、appendChild メソッドでコピーした要素を追加します。
elements.appendChild(copied);
イベントハンドラを設定
今回の例では、id = “add” ボタンをクリックすると要素のコピー&追加を行いますので、該当のボタンにイベントハンドラを設定します。
イベントハンドラには、これまでに実装した一連の機能をセットします。function としてまとめて構成し、イベントハンドラに入れ込みます。
// 要素をコピー&追加する関数
function addExample() {
let elements = document.getElementById("target");
let copied = elements.lastElementChild.cloneNode(true);
elements.appendChild(copied);
}
// ボタンにイベントハンドラをセット
const btn = document.getElementById("add");
btn.addEventListener("click", addExample, false);
サンプルコード
今回実装した機能を確認する為のサンプルコードを載せておきます。
<html>
<body>
<button id="add">Add!</button>
<div id="target">
<div>
<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);
elements.appendChild(copied);
}
// ボタンにイベントハンドラをセット
const btn = document.getElementById("add");
btn.addEventListener("click", addExample, false);
</script>
</body>
</html>
