Помогите понять код программы
Здравствуйте!
Я сейчас изучаю обработчики событий. А конкретно в данном случае, удаление обработчика событий. Есть три кнопки, одна из которых добавляет обработчик, вторая убирает. А третья это демонстрирует. html часть: <body> <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 src="./js/js.js"></script> </body> js часть (тут код с моими комментариями): (1) // получаем в переменные объекты по конкретному значению атрибута: const addBtn = document.querySelector('button[data-action="add"]'); const removeBtn = document.querySelector('button[data-action="remove"]'); const btn = document.querySelector("#btn"); (2) // создаем функцию обработчик: const handleClick = () => {alert("CLICK EVENT LISTENER ALERT!");}; (3) // назначаем обработчик для переменой addBtn по событию click... addBtn.addEventListener("click", () => { btn.addEventListener("click", handleClick); }); removeBtn.addEventListener("click", () => { btn.removeEventListener("click", handleClick); }); Вопрос: Что происходит в третьей части кода? Назначается обработчик для переменной addBtn по событию click. Вторым параметром метода addEventListener, handler, выступает целая стрелочная функция без аргументов... которая выполняет то-же самое что и внешняя для функции handleClick... Я за день мозг сломал. Объясните пожалуйста поподробнее что происходит в части (3). |
<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>
Цитата:
addBtn.addEventListener("click", _ => {
btn.addEventListener("click", handleClick);
});
или так...
addBtn.addEventListener("click", event => {
btn.addEventListener("click", handleClick);
});
Вы можете нажимать много раз на «Add Listener», но один и тот же обработчик добавляется только один раз! Т. е. если вы нажмёте 5 раз «Add Listener» и один раз «CLICK ME!», то у вас всплывёт только одно диалогое окно. P. S. Цитата:
<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>
|
AndriiS, посмотрите расширенный комментарий к пункту 3.
активация-деактивация кнопок без флагов....
<body>
<div class="container">
<button class="btn" data-action="add">Add Listener</button>
<button class="btn" data-action="remove" disabled>Remove Listener</button></div>
<hr>
<button id="btn" class="btn" disabled>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");
(2) // создаем функцию обработчик:
const handleClick = () => {
alert("CLICK EVENT LISTENER ALERT!");
addBtn.disabled = true;
removeBtn.disabled = false;
btn.disabled = false;
};
(3) // назначаем обработчик для переменой addBtn по событию click, по которому назначается обработчик события click по кнопке btn
addBtn.addEventListener("click", () => {
addBtn.disabled = true;
removeBtn.disabled = false;
btn.disabled = false;
btn.addEventListener("click", handleClick);
});
removeBtn.addEventListener("click", () => {
addBtn.disabled = false;
removeBtn.disabled = true;
btn.disabled = true;
btn.removeEventListener("click", handleClick);
});
</script>
</body>
|
| Часовой пояс GMT +3, время: 14:46. |