Как запускать события для элементов, созданных после других событий в Javascript?

#javascript #html #css

#javascript #HTML #css

Вопрос:

Я скопировал калькулятор Windows. Я застрял на «вкладке памяти».

Мне нужно создать события нажатия на три кнопки: MC M M- как показано ниже (в правом верхнем углу экрана). введите описание изображения здесь

Проблема в том, что эти кнопки (и все элементы вокруг) создаются впоследствии каждый раз, когда я нажимаю «MS» на главном калькуляторе (слева от экрана, над основными кнопками).

 function addMemoryValue(){
  const uls = document.createElement("ul");
  const lis = document.createElement("li");
  const h2s = document.createElement("h2");
  h2s.textContent = Number(display.textContent);
  const h3s = document.createElement("h3");

  uls.appendChild(lis);
  lis.appendChild(h2s);
  h2s.appendChild(h3s);

  let valueBtn = ["MC", "M ", "M-"];

  valueBtn.forEach((element) => {
  const memoryBtn = document.createElement("button");
  memoryBtn.setAttribute("value", element);
  memoryBtn.textContent = element;
  const memorySpn = document.createElement("span");
  memorySpn.appendChild(memoryBtn);
  memoryBtn.classList.add("btnsave");
  h3s.appendChild(memorySpn);

  const buttonTest = document.getElementsByClassName("btnsave");
  console.log(buttonTest.textContent);
  })
 

Я хочу повторить эти кнопки и создать операторы if в соответствии с textContent, но я не уверен, как настроить таргетинг на кнопки, поскольку они еще не существуют.

Если, например, я попробую следующее:

 const buttonTest = document.getElementsByClassName("btnsave");
console.log(buttonTest.textContent);
 

Я получаю «неопределенный» независимо от того, есть ли консоль.журнал находится внутри или вне функции.

Комментарии:

1. buttonTest будет массивом, а не элементом. См plainjs.com/javascript/selecting /…

2. Ок с console.log (buttonTest) Я получаю коллекцию html. Теперь я хочу повторить каждый элемент и запустить EventListener в соответствии с их атрибутом / индексом. Проблема в том, что когда я console.log(buttonTest.item(0)) для проверки первого элемента, я получаю «null». Чего мне не хватает?

Ответ №1:

Вы можете добавлять обработчики событий щелчка непосредственно там, где вы создаете кнопки, подобные этой:

 var clickHandler = function() {
    console.log("button clicked");
};

var button = document.createElement("button");
button.textContent = "test";
button.addEventListener("click", clickHandler);

document.getElementById("container").appendChild(button); 
 <div id="container">

</div> 

Обновление после комментария OPs:

Этот фрагмент создаст три кнопки при нажатии кнопки и добавит к ним три разных обработчика событий.

 var createButton = function(title, clickHandler) {
    var button = document.createElement("button");
    button.textContent = title;
    button.addEventListener("click", clickHandler);

    return button;
};

var removeButtons = function() {
    var container = document.getElementById('container');
    
    while (container.firstChild) {
      container.removeChild(container.lastChild);
    }
};

var createButtons = function() {
    removeButtons();
    
    var container = document.getElementById('container');
    
    container.appendChild(createButton("button 1", () => console.log("button 1 clicked")));
    container.appendChild(createButton("button 2", () => console.log("button 2 clicked")));
    container.appendChild(createButton("button 3", () => console.log("button 3 clicked")));
};

document.getElementById('create').addEventListener("click", createButtons);
document.getElementById('remove').addEventListener("click", removeButtons); 
 #container {
  border: 1px dashed teal;
  min-height: 1em;
} 
 <button id="create">create buttons</button>
<button id="remove">remove buttons</button>

<div id="container"></div> 

Комментарии:

1. Спасибо за помощь, но мои проблемы другие. Для упрощения вашего примера: мне нужно, чтобы событие щелчка на кнопке «test» генерировало другие три кнопки, повторяло их и запускало три разных прослушивателя addevent.

2. Я обновил свой ответ другим фрагментом. Это то, что вы хотите?

3. Типа того. давайте предположим, что существует несколько ul с теми же элементами, которые вы создали выше (htmlколлекция ul). Как я могу убедиться, что при нажатии кнопки 1 «нажата кнопка 1» фактически добавляется к «текущему» ul, а не к первому дочернему элементу htmlcollection ?.

4. Вы можете передавать ссылки на все нужные вам элементы при создании обработчиков кликов. Вы можете думать об этом как о «контексте» для ваших обработчиков.

5. Я разобрался с делегированием событий. Спасибо.