Показать сообщение отдельно
  #2 (permalink)  
Старый 15.10.2018, 00:42
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

<div class="container">
	<button class="btn" data-action="add">Add Listener</button>
	<button class="btn" data-action="remove">Remove Listener</button>
</div>
<hr>
<button id="btn" class="btn">CLICK ME!</button>

<script>
// (1) получаем в переменные объекты по конкретному значению атрибута:
const addBtn    = document.querySelector("button[data-action=add]");
const removeBtn = document.querySelector("button[data-action=remove]");
const btn       = document.querySelector("#btn");

// (2) создаем функцию обработчик:
// Эта функция с именем handleClick будет вызываться, когда она 
// будет зарегистрирована как обработчик события. Ей в качестве
// аргумента будет передаваться экземпляр класса Event, который
// содержит информацию о происшедшем событии. Обратите внимание
// на то, что передача аргумента происходит вне зависимости от
// объявления в списке аргументов. 
const handleClick = event => { alert("CLICK EVENT LISTENER ALERT!"); };
// const handleClick = () => { alert("CLICK EVENT LISTENER ALERT!"); };

// (3) назначаем обработчик для переменой addBtn по событию click...
// При нажатии на кнопку «Add Listener» на кнопке «CLICK ME!»
// регистрируется обработчик handleClick, так что при нажатии
// на кнопку «CLICK ME!» будет вызываться handleClick с актуальным
// экземпляром класса Event
addBtn.addEventListener("click", () => {
	btn.addEventListener("click", handleClick);
});

// При нажатии на кнопку «Remove Listener» у кнопки «CLICK ME!»
// отнимается обработчик handleClick, так что при нажатии
// на кнопку «CLICK ME!» больше не будет вызываться handleClick 
removeBtn.addEventListener("click", () => {
	btn.removeEventListener("click", handleClick);
});
</script>


Сообщение от AndriiS
стрелочная функция без аргументов
Как уже было отмечено ей передаётся параметр, только вы не хотите его принимать... Можно было записать так...

addBtn.addEventListener("click", _ => {
	btn.addEventListener("click", handleClick);
});


или так...
addBtn.addEventListener("click", event => {
	btn.addEventListener("click", handleClick);
});


Вы можете нажимать много раз на «Add Listener», но один и тот же обработчик добавляется только один раз! Т. е. если вы нажмёте 5 раз «Add Listener» и один раз «CLICK ME!», то у вас всплывёт только одно диалогое окно.

P. S.
Сообщение от AndriiS
Я за день мозг сломал.
Я к вашему примеру добавил флажок, регулирующий возможность выключения фукционала кнопок «Add Listener» и «Remove Listener». Поломаете мозг? Или теперь это слишком просто?

<div class="container">
	<button class="btn" data-action="add">Add Listener</button>
	<button class="btn" data-action="remove">Remove Listener</button>
	<label><input data-action="register" type="checkbox" checked> Registered</label>
</div>
<hr>
<button id="btn" class="btn">CLICK ME!</button>

<script>
const addBtn     = document.querySelector("button[data-action=add]");
const removeBtn  = document.querySelector("button[data-action=remove]");
const btn        = document.querySelector("#btn");
const registerCB = document.querySelector("input[data-action=register]");

const handleClick    = _ => alert("CLICK EVENT LISTENER ALERT!");
const addListener    = _ => btn.addEventListener("click", handleClick);
const removeListener = _ => btn.removeEventListener("click", handleClick);

addBtn.addEventListener("click", addListener);
removeBtn.addEventListener("click", removeListener);

registerCB.addEventListener("input", ({ target }) => {
	if(target.checked) {
		addBtn.addEventListener("click", addListener);
		removeBtn.addEventListener("click", removeListener);
	} else {
		addBtn.removeEventListener("click", addListener);
		removeBtn.removeEventListener("click", removeListener);
	}
});

</script>
Ответить с цитированием