Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

名前、ニックネームを追加時、各行の右に削除ボタンを出力して、 削除ボタンをクリックするとボタンがある行を削除する処理を作成したいのですが 何度実行しても削除ボタンが実行されません。

名前、ニックネームを追加時、各行の右に削除ボタンを出力して、
削除ボタンをクリックするとボタンがある行を削除する処理を作成したいのですが
何度実行しても削除ボタンが実行されません。
しかし、コンソールにエラーも出ません。。(;;)

どなたかご教授頂けると嬉しいです!
HTMLはこちら

        <div class="base container">
          <div class="row">
            <h1>アカウント登録</h1>
          </div>
          <div class="row">
            <div class="card" id="card">
              <div class="card-block">
                <form id="form-area" class="form-inline" method="post">
                    <div class="form-group">
                        <div class="input-group">
                          <input id="namae" name="namae" type="text" class="form-control" placeholder="名前">
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="input-group">
                            <input id="nickname" name="nickname" type="text" class="form-control" placeholder="ニックネーム">
                        </div>
                    </div>

                    <div class="form-group">
                      <input id="tuikaBtn" type="button" name="touroku" value="追加">
                    </div>

                </form>
                <div id="tuikaMoto">

                </div>
                <div id="result"></div>
              </div>
            </div>
          </div>  
        </div>
      </div>
      <div id="overLay">
      </div>

Javascriptはこちら

<script>
          // ここに処理を書いていきます。
			let tuikaTimes = 0;
			let result = document.getElementById("result");
			let tuikaBtn = document.getElementById("tuikaBtn");	
			let formArea = document.getElementById("form-area");
            let table = document.createElement("table");
			let tbody = document.createElement("tbody");
			let tr = document.createElement("tr");
			let td1 = document.createElement("td");
			let td2 = document.createElement("td");
            let td3 = document.createElement("td");
            let deleteBtn =document.createElement("input")
            deleteBtn.type = 'button';
            deleteBtn.value ='削除';
			td1.textContent="名前";
			td2.textContent="ニックネーム";
            td3.appendChild(deleteBtn);
			tr.appendChild(td1);
			tr.appendChild(td2);
            tr.appendChild(td3);
			tbody.appendChild(tr);
			table.appendChild(tbody);
			formArea.appendChild(table);
      

						 
		        //追加ボタン押したら	
			    tuikaBtn.addEventListener('click',function(){
				const namae = document.getElementById("namae");
				const nickname = document.getElementById("nickname");
				const result = document.getElementById("result");
				
				if(namae=="" || nickname==""){
					alert("空です");
				}else{
                 //入力されていたら
				if(!window.confirm(namae.value+"さん"+nickname.value+"を登録します。よろしいですか?")){
					return false;}
			    //登録してよいか確認 OKの場合 
					else{
               
			    //tuikaTimesを1つずつ増やす記述
					    tuikaTimes++;
		
					
			    //登録しましたよとアラートして関数adtrを実行
						alert(namae.value+'さん'+nickname.value+'にて登録しました');
						adtr(namae.value,nickname.value,deleteBtn);
			
                        }}
                 //3回以上おせなくするかくす
			    if(tuikaTimes >= 3){
				        tuikaBtn.style.visibility="hidden";
				        }


    //閉じ
    })
			

      //functionadtrのなかみ
function adtr(aa,bb,cc){
  const deleteBtn =document.createElement("input");
  deleteBtn.type = 'button';
  deleteBtn.value ='削除';
  const newRow = table.insertRow();
  const newCell = newRow.insertCell();
  const newText = document.createTextNode(aa);
  newCell.appendChild(newText);
  newCell2 =newRow.insertCell();
  newText2 = document.createTextNode(bb);
  newCell2.appendChild(newText2);
  const newCell3 = newRow.insertCell();
  newText3 = deleteBtn;
  newCell3.appendChild(newText3);
}

        //削除ボタン!!!
            deleteBtn.addEventListener('click',()=>{
            
            const table = document.querySelector("table");
            const tbody = document.querySelector("tbody");
            const tr = document.querySelector("tr");
            table.tbody[0].deleteRow(-1);
            tuikaTimes--;
        })
			//ボタンを元に戻す
			if(tuikaTimes < 3){
				tuikaBtn.style.visibility="visable";
				}

			
			
        </script>
0

2Answer

筆者の手元でコードを試用したところ以下の内容でデフォルト表示?の「名前 ニックネーム」項目を削除できました。

//functionadtrのなかみ
function adtr(aa,bb,cc){
  const deleteBtn =document.createElement("input");
  deleteBtn.type = 'button';
  deleteBtn.value ='削除';
+ deleteBtn.addEventListener('click', () => {
+   deleteRow(deleteBtn);
+ });
...
..
.
//削除ボタン!!!
+ function deleteRow(deleteBtn) {
+   const row = deleteBtn.closest('tr');
+   row.remove();
+   tuikaTimes--;
+   
+   if (tuikaTimes < 3) {
+     tuikaBtn.style.visibility = "visible";
+   }
+ }
- deleteBtn.addEventListener('click', () => {
-   const table = document.querySelector("table");
-   const tbody = document.querySelector("tbody");
-   const tr = document.querySelector("tr");
-   table.tbody[0].deleteRow(-1);
-   tuikaTimes--;
-  })
- //ボタンを元に戻す
- if (tuikaTimes < 3) {
-  tuikaBtn.style.visibility = "visable";
- }

@YottyPG さんからの上記回答の流れで調整したcodepenです。
※私のスキル・知識不足から質問欄を汚して失礼いたしました。

See the Pen Untitled by benjuwan (@benjuwan) on CodePen.

2Like

Comments

  1. @miiiiiiiiiitan

    Questioner

    @benjuwan 様
    コードまで書き直してくださりありがとうございました・・!!
    本当にご丁寧に教えてくださり感謝です!1週間悩み続けて、調べまくってもなかなかむずかしかったので本当にありがとうございます!無事実行できて完成いたしました。ありがとうございました!

現在の記述ですと、起動時に存在するdeleteBtnにしかクリックイベントが割り付かないようになっています。

要素を追加するごとにそのボタンにクリックイベントを割り付けるようにしてあげれば、削除ボタン押下時の処理を実装することができます。

function adtr(aa,bb,cc){
  //追加処理

+  deleteBtn.addEventListener('click',()=>{
+    //削除処理
+  })
}
2Like

Comments

  1. 別のやり方として親要素にイベントを設定する方法もあります。

    今回でいうと削除ボタンの親要素tableにクリックイベントを割り付けておいて、押された要素がINPUTの時、すなわち削除ボタンであればその処理を記述する、というような実装でも実現できると思います。

    table.addEventListener('click',(event)=>{
      if (event.target.tagName === "INPUT") {
        //削除ボタンが押されたときの処理
      }
    })
    

    参考:

  2. @YottyPGさん
    筆者の仕様への理解不足で申し訳ありません。ご指摘及び補足をありがとうございます。
    再度調整し直しました。
    急いで調整していると、まさか@YottyPGさんが仰られた通りの方法(親要素にイベントを設定する)で実装していましたw

  3. @benjuwan

    tr要素も動的に追加される要素なので、修正後のコードも追加行にある削除ボタンは現状効いてないような気がします:cry:

  4. @miiiiiiiiiitan

    Questioner

    @YottyPG
    本当にご丁寧に教えてくださりありがとうございます。
    親要素にイベントを設定し、function adtrに削除ボタンの実行コードを入れるとよいのですね!!参考サイトまでありがとうございました。何度も読みこめるように永久にブックマークします!
    無事実行でき完成することができました。ありがとうございました!!

  5. 再度の不具合で申し訳ありません。
    それにもかかわらず丁寧にご返信及びご指摘いただきありがとうございます!

    @YottyPG さんが回答されていた通りの方法で動的生成されたリストの削除が行えるようになりました。
    (調整したものは私が回答した codepen にあります)

    @YottyPG さんがご指摘してくださったお陰で大変勉強になりました。
    ありがとうございました!

  6. 解決したようでよかったです!
    解決したようであればクローズにしていただけるとありがたいです!

Your answer might help someone💌