169 похожих чатов

👋 Есть три кнопки, с помощью замыкания нужно показывать на самой

кнопке количество нажатий на каждую из них.

const parent = document.querySelector('.wrapper');

function closure() {
let count = 0;
return function() {
count++;
this.innerText = count;
}
}

let a = closure();

parent.addEventListener('click', (e) => {
a.call(e.target);
})

сейчас у меня count является одним счетчиком для трех кнопок, как я могу сделать, чтобы у каждой кнопки был свой count ?
и чтобы код был гибким и не плодить слушатели событий?

23 ответов

22 просмотра

ну так что значит не плодить, если вам нужно на каждую кнопку?)

Леша- Автор вопроса
i7 4n
ну так что значит не плодить, если вам нужно на ка...

я вот и спрашиваю, может есть более лаконичный способ решить такую задачу, о которм я не знаю

На контейнер повесить слушатель, а не на каждую кнопку

Владимир
На контейнер повесить слушатель, а не на каждую кн...

там так и есть, внимательнее, молодой человек

Леша- Автор вопроса
Леша
слушатель и так на контейнере

А зачем лаконичнее? Для себя?

Леша
конечно)

а замыкание зачем вам всё-таки

Леша- Автор вопроса
i7 4n
а замыкание зачем вам всё-таки

нашел у себя большой пробел по ним, пробую решать

Леша
конечно)

Есть очень сложный ответ на твой вопрос) Не надо лаконичнее, поверь. Если не лень почитать могу скинуть материал по теме.

Леша
давай)

На англ. правда https://overreacted.io/goodbye-clean-code/

function closure() { const counter = new Map(); return function() { if (counter.has(this)) { counter.get(this).val++; } else { counter.set(this, { val: 1 }); } this.textContent = counter.get(this).val; } } const parent = document.querySelector('.wrapper'); const counter = closure(); parent.addEventListener('click', ({ target }) => counter.call(target)); такое, мб, проканает. но можно и покрасивше написать

Леша- Автор вопроса
i7 4n
function closure() { const counter = new Map(); ...

рил сложно для меня) буду разбираться, спасибо)

Леша
рил сложно для меня) буду разбираться, спасибо)

я там чуть ещё подрихтовал, чтоб чуть приятнее стало. проверьте, работает ли

Леша
работает прекрасно)

а, ну ок, потому что я ничё не проверял хд

i7 4n
function closure() { const counter = new Map(); ...

Слушай, а зачем counter.call? Что если без this и в closure передавать event? Тогда прям совсем красиво будет)

Владимир
Слушай, а зачем counter.call? Что если без this и ...

я взял оригинальное решение, не более. сам бы я и сделал, чтоб он элемент принимал

function Counter() { const _counter = new Map(); return { count(element) { _counter.set(element, _counter.has(element) ? _counter.get(element) + 1 : 1); return _counter.get(element); }, get counter() { return _counter } }; } const counter = Counter(); document.querySelector(".wrapper").addEventListener("click", ({ target }) => { target.textContent = counter.count(target); console.log(counter.counter); }); но в итоге я бы +- так написал, потому что у вас очевидное нарушение SRP было. и не должна была та фигня отвечать за отрисовку над названиями, мб, стоит поработать, но это уже другой вопрос)

Леша- Автор вопроса
i7 4n
function Counter() { const _counter = new Map();...

const btns = document.querySelectorAll('.btn'); function closure() { let count = 0; return function() { count++; this.innerText = count; } } btns.forEach(e => { e.addEventListener('click', closure()); })

Похожие вопросы

Обсуждают сегодня

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
Всем привет! вывожу на общей стр дочерние ресурсыв каждом ресурсе галерея, и первая фотка должна выводиться на общей [!DocLister? &prepare=photo !]
Alekso
12
А можно вопрос? Мне сегодня сказали что у меня функция (которая просто заполняет массив значениями) не правильная void Full(double * arr, int n) { for (int i = 0; i < n; i...
† C E †
7
День добрый, подскажите пожалуйста, есть ли какой-то способ сказать ребару не компилировать определённое приложение? Всю доку их перечиатл ничего подобного не нашёл
Кирилл
14
Добрый вечер. Хочу чтобы у меня в классе поле было функцией, которая возвращает строку. Делаю так: interface ... TGetOutPath = function : String of object; ... protec...
Kirill Filippenok
12
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
10
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Здравствуйте, хочу сделать HelloWorld в консоли Дельфи, но функция API ничего не выводит, что я делаю не так? program Hello; {$APPTYPE CONSOLE} uses System.SysUtils, WinAPI.Wi...
Sergey Vinogradov
20
Карта сайта