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 ответов

23 просмотра

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

Леша- Автор вопроса
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()); })

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта