oiken
@oiken (KENTARO OIKAWA)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

JavaScriptにて投稿機能を作成中にエラーが発生しました。

解決したいこと

Uncaught TypeError: deleteButtonClick.addEventListener is not a function

HTML/css/javascriptにて投稿機能を作っています。
名前とニックネームを追加3回したら追加ボタンを非表示にし、削除ボタンを押したら再表示できるようにしたく作成したましたが、エラーが発生してしまい困っております。どなたか解決方法教えていただけますと幸いです。

発生している問題・エラー

Uncaught TypeError: deleteButtonClick.addEventListener is not a function

dbc1c168123542bb25aefde98b496541.png

該当するソースコード

<!DOCTYPE html>
<html>
    <head>
        <title>アカウント登録</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        
        <style>
          th,td{
              /* ヘッダ背景塗りつぶし */
              background: #eee;
            }
          th,td {
            /* 枠線を1本線指定 */
              border: solid 1px;
              width:auto;
          }

          table{
            /* 枠線を1本線指定 */
              border: solid 1px;
              border-collapse:  collapse;
              white-space: nowrap;
          }
          /*.deletion{
            width: 50px;
            margin-left: 450px;
            display: block;
            position:relative;
            bottom:220px;
            margin-bottom: 80px;
          }*/

          .base {
            margin: 2% 7% 0;
            height: 500px;
            background: blue;
            padding: 5% 10%;
            box-shadow: 5px 9px 8px 5px rgba(0, 0, 0, 0.5);
          }
          input {
            width: 300px;
            height: 40px;
            font-size: large;
          }
          #tuikaBtn {
            background: green;
          }
          h1 {
            font-family: serif;
          }
          .form-control::placeholder {
              color: #cacaca;
              opacity: 1;
          }
          table {
            border-collapse: collapse; 
          }

          th,td {
            border: 1px solid #312929;
            padding: 5px 10px;
          }
          .card {
            width: 100%;
            height: 350px;
          }
          .back{
            padding: 30px;
            position: absolute;
            bottom: 0;
            right: 0;
          }
          .form-group{
            margin: 10px 0 15px 0px;
          }
          #result {
            font-size: 120%;
            margin: 10;
            margin: 10px 20px;
            padding: 10px 5px 20px;
            margin: 10px 5px 10px 5px;
          }

          .row .card{
            color: red;
          }

          .card{
            color: blue;
            display: block;
            position: relative;
          }

          #modal{
            display: none;
            margin:1.5em auto 0;
            background-color: white;
            border: 1px solid black;
            width: 50%;
            padding: 10px 20px;
            position: fixed;
            border-radius: 5px;
          }

          #overLay{
            display: none;
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 120%;
            background-color: rgba(0,0,0,0.75);
          }

        </style>
    </head>
    <body>
        <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="name" name="name" 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>

      <script language="Javascript">
var count=0;
let table;
let rows;

  let tuikaBtn = document.getElementById("tuikaBtn");
      tuikaBtn.addEventListener("click",function() {
  var name = document.getElementById("name").value;
  var nickname = document.getElementById("nickname").value;
  //var body = document.getElementsByTagName("body")[0];

   //テーブル
  const result = document.getElementById("result")
  var table = document.createElement('table');// table要素を生成
  table.id = 'table';
  var tr = document.createElement('tr');// tr要素を生成
  var th = document.createElement('th');// th要素を生成
  var td = document.createElement('td'); // td要素を生成
  var thead = document.createElement('thead');//thead要素
  var child = document.createElement("td");
  var child1 = document.createElement("td");



  result.appendChild(table);
  table.appendChild(thead);
  thead.appendChild(tr);
  tr.appendChild(child);
  tr.appendChild(child1); 

  //削除ボタン
  const delButton = document.createElement('input');
  delButton.classList.add('deletion');
  delButton.type = 'button';
  delButton.value = `削除`;
  delButton.setAttribute('onclick', 'remove(this)');
  tr.appendChild(delButton);
  delButton.style.width = '50px';
  delButton.style.height = '40px';
 
 
 

  

  if(!name || !nickname ){
      flag = 1;  
      window.alert('必須項目未入力'); // 入力漏れがあれば警告ダイアログを表示
    return false;
    }
        
    if (!window.confirm(name + "さん " + nickname +"を登録します。よろしいですか?" ))
      { return false;
   }
                
    window.alert(name + "さん" + nickname+ "にて登録しました。");
              

    child.textContent=("名前"+name)
    child1.textContent=("ニックネーム"+nickname);
  

    rows = table.rows;
    

  //3回投稿で非表示
  if(count < 2){
      count++;
    return true;
  } else {
    let tuika = document.getElementById("tuikaBtn");
        tuika.style.visibility="hidden";
  return false;
  }      
});  
    


let deleteButtonClick;

//削除
  function remove(target) {
  let tr = target.parentNode.parentNode;
  tr.remove();
  if (count > 1) {
         count ++;
            const deleteButtonClick = document.getElementsByClassName('deletion');
                  deleteButtonClick.addEventListener('click',()=> {
                  tuikaBtn.classList.add('block');
            }, false);
    }
}
 </script>
 </body>


</html>

エラー発生コード

  function remove(target) {
  let tr = target.parentNode.parentNode;
  tr.remove();
  if (count > 1) {
         count ++;
            const deleteButtonClick = document.getElementsByClassName('deletion');
                  deleteButtonClick.addEventListener('click',()=> {
                  tuikaBtn.classList.add('block');
            }, false);
1

2Answer

getElementsByClassNameは該当ノードの配列を返します.
それらすべてに処理を行う場合はforeachしないとダメです.

2Like

Comments

  1. @oiken

    Questioner

    教えて頂きありがとうございます。
    無事解決いたしました。

getElementsByClassNameHTMLCollectionを返します。

idはHTML内で1つしかありませんが、classは複数の要素に割り当てることが可能なので、複数の要素からなるコレクションになります。

そしてHTMLCollectionaddEventListenerメソッドを持ちません。
既に回答があるように、コレクションの中の個別の要素に対してイベントを設定する必要があります。
(ちなみにHTMLCollectionは正確には配列ではないのでforEachメソッドを持ちません)

HTMLCollectionにaddEventListenerする例
const elements = document.getElementsByClassName('test');

// forEach is not a function 
// elements.forEach();

Array.prototype.forEach.call(elements , element => {
  element.addEventListener('click',()=> {
    console.log('click 1');
  });
});

for(let i = 0 ; i < elements.length ; i ++ ) {
  elements[i].addEventListener('click',()=> {
    console.log('click 2');
  });
}
2Like

Comments

  1. @oiken

    Questioner

    教えて頂きありがとうございます。
    無事解決いたしました。

Your answer might help someone💌