Сделать обработчик кликов с замыканием
нужна помощь новичку))
подскажите как реализовать: "ну жен обработчик для кнопок и считаем количество этих кликов по каждой кнопке, выводя результат в саму кнопку, т.е. как текстовое значение кнопки. Количество нажатий для каждой кнопки должно хранится в замыкании, т.е. должна быть только одна функция подсчета кликов, но использоваться для любого количества кнопок (подразумевается, что кнопок может быть как одна, так и пара сотен...)." ps есть пример на learn.js но не понимаю как в innerHTML самой кнопки засунуть результат счетчика. |
gunner17,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
.btn:after{
content: attr(num);
margin-left: 3px;
}
</style>
<script>
document.addEventListener("click", function(event) {
const target = event.target.closest(".btn");
if(target) {
let num = +target.getAttribute("num") || 0;
target.setAttribute("num", ++num)
}
});
</script>
</head>
<body>
<div class="btn">click me!</div>
<div class="btn">click me!</div>
<div class="btn">click me!</div>
</body>
</html>
|
Цитата:
Цитата:
<button is="click-counter"></button>
<button is="click-counter"></button>
<button is="click-counter"></button>
<style>
[is="click-counter"]::before { content: "Click me! "}
</style>
<script>
class ClickCounter extends HTMLButtonElement {
constructor() {
super();
const clickHandler = this.counterClosure;
this.addEventListener("click", clickHandler);
clickHandler();
}
get counterClosure() {
let counter = 0;
return () => this.textContent = counter++;
}
}
customElements.define("click-counter", ClickCounter, { extends: "button" });
</script>
|
Malleys,
:) :thanks: |
Цитата:
|
Цитата:
const clickHandler = this.counterClosure; выглядит так, как будто это ссылка на функцию (что в принципе и есть), а без геттера это выглядело бы как присвоение константе результата выполнения функции! |
Цитата:
чем плох такой вариант?
<button is="click-counter"></button>
<button is="click-counter"></button>
<button is="click-counter"></button>
<style>
[is="click-counter"]::before { content: "Click me! "}
</style>
<script>
class ClickCounter extends HTMLButtonElement {
constructor() {
super();
const clickHandler = this.counterClosure();
this.addEventListener("click", clickHandler);
clickHandler();
}
counterClosure() {
let counter = 0;
return () => this.textContent = counter++;
}
}
customElements.define("click-counter", ClickCounter, { extends: "button" });
</script>
|
| Часовой пояс GMT +3, время: 22:21. |