質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

11496閲覧

ボタンを押すと要素が消える仕様にしたい

ryoo_chksl

総合スコア69

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2018/11/17 11:29

html

1<div class="choicesContainer"> 2 <input type="text" maxlength="30" class="choice"> 3 <input type="text" maxlength="30" class="choice"> 4</div> 5<div class="add">追加</div>

javascript

1(function() { 2 'use strict'; 3 4 var add = document.getElementsByClassName('add'); 5 var choicesContainer = document.getElementsByClassName('choicesContainer'); 6 7 add[0].addEventListener('click', function() { 8 var choiceFrame = document.createElement('div'); 9 var delBtn = document.createElement('div'); 10 var input = document.createElement('input'); 11 12 13 choiceFrame.classList.add('choiceFrame'); 14 delBtn.classList.add('delBtn'); 15 input.setAttribute('type', 'text'); 16 input.setAttribute('maxlength', '30'); 17 input.classList.add('choice'); 18 19 delBtn.innerHTML = '×'; 20 choiceFrame.appendChild(input); 21 choiceFrame.appendChild(delBtn); 22 choicesContainer[0].appendChild(choiceFrame); 23 24 25 var choiceBox = document.getElementsByClassName('choiceFrame'); 26 var del = document.getElementsByClassName('delBtn'); 27 28 for(var i = 0; i < del.length; i++) { 29 del[i].addEventListener('click', function() { 30 choiceBox[i].remove(); 31 }) 32 } 33 }) 34})();

「追加」を押すと、inputタグと×印が両方現れます。×印を押すと、×印も消え、さらに一緒に出現してきたinputタグも同時に消えるようにしたいのですが、うまくいきません。
どのように改善すればよいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/11/17 13:09

「うまくいきません」とは何が起きているのでしょうか?実際に起きた現象・問題・エラーなどありましたら追記してください。
ryoo_chksl

2018/11/17 13:55

「追加」をx回押したときにあらわれるバツ印をXバツ、inputをXinputとします。1バツを押すと2inputが消えたり、2inputと4inputが同時に消えたり、問題はいろいろと生じています。生じる問題の傾向性が自分もよく分かっていないので、言語化が難しいです。お手数ですが、コードをテキストエディタにコピペして実際にどういう動きになるのかを見ていただいた方が分かりやすいかと思われます。
m.ts10806

2018/11/17 13:57

質問は編集できるので追記してください。質問者さんが何をどこまで把握しているかは回答のために必要な情報ですが、こちらのコメント欄はデフォルト非表示で目につきにくいですし質問本文との連動性もとりづらくなるので
guest

回答2

0

ベストアンサー

対応

削除ボタンのイベントリスナーの設定を次のように置き換えてください。

変更前

javascript

1 // 以下8行を削除 2 var choiceBox = document.getElementsByClassName('choiceFrame'); 3 var del = document.getElementsByClassName('delBtn'); 4 5 for(var i = 0; i < del.length; i++) { 6 del[i].addEventListener('click', function() { 7 choiceBox[i].remove(); 8 }) 9 }

変更後

javascript

1 // この3行を追加 2 delBtn.addEventListener('click', function() { 3 choiceFrame.remove(); 4 });

説明

最後に行なっている処理は、削除ボタンにイベントリスナーを設定し直す処理だと思いますが、addEventListenerは同じイベントに対して異なるイベントリスナーを指定して複数回呼び出すと、上書きではなく追加になります。

今回のコードでは、追加のたびに無名関数を新しく生成している状態なので追加になります。
その結果、削除ボタンのクリックで複数のイベントリスナーが実行されます。

まず、既存の削除ボタンは変更せずに、新しく追加した削除ボタンにだけイベントリスナーを追加するようにします。

次に、削除する対象も新しく追加した要素(choiceFrame)として特定できているので、それに対してremove()を呼び出します。

補足

どこまでクロージャを知っているかで説明できる内容が変わるのですが、追加ボタンのイベントリスナーが外部関数となり、削除ボタンのイベントリスナーが内部関数となります。

内部関数である削除ボタンのイベントリスナーに対して、クロージャが作られます。

クロージャの機能によりスコープ内にあるchoiceFrame変数を束縛できます。

choiceFrame変数は、追加ボタンのイベントリスナーのローカル変数なので、追加処理のたびに新しく生成され、名前は同じですが削除ボタンのイベントリスナーは異なるchoiceFrame変数を束縛している状態になります。

なので、delBtnと合わせて生成したchoiceFrameを対応付けられるので、変更後のようなコードになります。

説明難しいですノω≦)

詳しくは、developer.mozilla.orgの関数 - javascript/入れ子の関数とクロージャを参考に。

投稿2018/11/19 04:25

StupidDog

総合スコア263

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

StupidDog

2018/11/19 04:26

被っちゃったノω≦)
guest

0

追加した要素だけ削除するようにすればいいので。

JavaScript

1 delBtn.addEventListener('click', function(event) { 2 choiceFrame.remove(); // event.target.parentNode.remove(); 3 }, { capture: false, once: true, passive: true });

投稿2018/11/19 04:21

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問