Как исправить этот JavaScript код

Ожидаемое поведение: При нажатии на первую кнопку появляется вторая кнопка, а при нажатии на вторую кнопку вторая кнопка исчезает. Можете помочь мне исправить мой код. У меня при нажатии на первую кнопку появляется вторая, при нажатии на вторую вторая исчезает, но при повторном нажатии на первую вторая не появляется.

let Mybutton = document.getElementById("first");
let Form = document.getElementById("myform");
let isNewButtonExist = false;
let str = `<button id = "second" > Вторая кнопка </button>`;
let NewButton;

Mybutton.addEventListener("click", function(event) {
  if (isNewButtonExist === false) {
    Form.innerHTML += `<button id = "second" > Вторая кнопка </button>`;
    isNewButtonExist = true;
  }

  if (isNewButtonExist === true) {
    NewButton = document.getElementById("second");
    NewButton.addEventListener("click", function() {
      isNewButtonExist = false;
      NewButton.remove();
      NewButton = null;
    });
  }
})
.MyWindow {
  border: 3px solid black;
  width: calc(1000px + 6px);
  height: calc(800px + 6px);
  box-sizing: border-box;
  margin-left: 100px;
  margin-top: 20px;
  background-color: #ffffff;
}

button {
  /* border: 1px solid black; */
  width: 100px;
  height: 50px;
  box-sizing: border-box;
  margin-left: 20px;
  margin-top: 25px;
}
<html>

<head>

  <body>
    <div class="MyWindow">
      <form action="#" id="myform">
        <button id="first"> Первая кнопка </button>
      </form>
    </div>
    <script src="testjs.js">
    </script>
  </body>

</html>


Ответы (1 шт):

Автор решения: Алексей Шиманский

Проблема в том, что вы меняете html формы, а когда это происходит то все слушатели "спадают". Нужно заново вешать слушателей.

я добавил так:

Form.querySelector("#first").addEventListener("click", onFirstButtonClick);

смотрите пример полностью:

let Mybutton = document.getElementById("first");
let Form = document.getElementById("myform");
let isNewButtonExist = false;
let str = `<button id = "second"  type="button"> Вторая кнопка </button>`;
let NewButton;

Mybutton.addEventListener("click", onFirstButtonClick);

function onFirstButtonClick(event) {  
  if (isNewButtonExist === false) {
    Form.innerHTML += `<button id="second"  type="button"> Вторая кнопка </button>`;
    isNewButtonExist = true;
    Form.querySelector("#first").addEventListener("click", onFirstButtonClick);
  }

  if (isNewButtonExist === true) {
    NewButton = document.getElementById("second");
    NewButton.addEventListener("click", function() {
      isNewButtonExist = false;
      NewButton.remove();
      NewButton = null;
    });
  }
}
.MyWindow {
  border: 3px solid black;
  width: calc(1000px + 6px);
  height: calc(800px + 6px);
  box-sizing: border-box;
  margin-left: 100px;
  margin-top: 20px;
  background-color: #ffffff;
}

button {
  /* border: 1px solid black; */
  width: 100px;
  height: 50px;
  box-sizing: border-box;
  margin-left: 20px;
  margin-top: 25px;
}
<div class="MyWindow">
  <form action="#" id="myform">
    <button id="first" type="button"> Первая кнопка </button>
  </form>
</div>

Но это *очень кривой вариант.. Вам нужно изучить тему делегирование событий, как раз необходимых в тот момент, когда есть динамически меняющийся контент, как у вас.

А вообще, в данном конкретном случае я бы просто сразу бы добавил кнопку в html, сделал бы display: none, а по клику просто показывал её или скрывал... то есть без физического удаления.

P.S.

Также обратите внимание, что тип кнопок специально поставил button, потому что в ином случае по умолчанию они будут триггерить сабмит формы

→ Ссылка