前回までの記事で、ボタン押下で動的に要素を追加するコードを実装してきましたが、
今回は、ボタン押下で動的に要素を削除する機能を実装します。
各要素の最後にある「remove」ボタンをクリックすることで

確認ダイアログが表示され、「OK」をクリックすると

そのボタンがある行が丸々削除されます。

html構成
htmlの構成はこのようになっています。
<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">
<input type="radio" name="yn" value="Yes" checked="checked">Yes
<input type="radio" name="yn" value="No" >No
<button onclick="removeExample(this)">remove</button>
</div>
</div>
セレクトメニュー、テキストボックス、チェックボックス、ラジオボタン、ボタン、の順に並んでいます。
この最後のボタンを押下することで、その行に含まれるすべての要素が削除されます。
(ボタンが含まれる “div” 単位で削除。ボタンの「親要素」ですね。)
変数 “this”
「remove」ボタンを押下したときに、その要素そのものを取得したいので、”this”変数を使用します。
html中で、これを使った削除用関数を設定しています。
<button onclick="removeExample(this)">remove</button>
削除ロジック
削除ロジックとして、関数を定義します。
基本的には、要素変数に対して remove メソッドを使用するわけですが、今回の例では次の点がポイントとなります。
- “this” で取得した要素の「親要素」に remove メソッドを適用
(button 要素の上位の div 単位で削除したいため) - 削除の前には確認メッセージを表示し、「OK」の場合にのみ削除処理を続行
function removeExample(button) {
if (window.confirm('本当に削除しますか?')) {
let parent = button.parentNode;
parent.remove();
}
}
サンプルコード
動作確認のための全体のサンプルコードは以下。
(前回までのコードも全て含まれています。)
<html>
<head>
</head>
<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">
<input type="radio" name="yn" value="Yes" checked="checked">Yes
<input type="radio" name="yn" value="No" >No
<button onclick="removeExample(this)">remove</button>
</div>
</div>
<script type="text/javascript">
let cnt = 1;
const btn = document.getElementById("add");
function addExample() {
++cnt;
let elements = document.getElementById("target");
let copied = elements.lastElementChild.cloneNode(true);
// セレクトメニューの値をコピー
let val = elements.lastElementChild.firstElementChild.selectedIndex;
copied.firstElementChild.selectedIndex = val;
// コピー先ラジオボタンのname属性を編集
copied.children[3].setAttribute("name", "yn" + cnt);
copied.children[4].setAttribute("name", "yn" + cnt);
elements.appendChild(copied);
}
btn.addEventListener("click", addExample, false);
function removeExample(button) {
if (window.confirm('本当に削除しますか?')) {
let parent = button.parentNode;
parent.remove();
}
}
</script>
</body>
</html>
サンプルを稼働させれば、冒頭で示した挙動が得られるはずです。
