#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. Я разобрался с делегированием событий. Спасибо.