Методи підключення подій в VanillaJS

💡 Усі статті, обговорення, новини про Front-end — в одному місці. Приєднуйтесь до Front-end спільноти!


Привіт! Мене звати Віктор, працюю front-end розробником 6 місяців.

Я маю практичний досвід використання популярних JavaScript фреймворків, таких як Vanilla.js, React та Vue. На робочому проєкті у мене були складності з підключенням подій на динамічні елементи, тому вирішив розібрати 5 методів підключення подій у JavaScript.

5 способів підключення подій у JavaScript

  1. Inline підключення
  2. Атрибут onclick до знайденого Element
  3. Метод addEventListener()
  4. Динамічне додавання елементів у DOM
  5. Підвішування обробника на батьківський елемент

  1. Inline підключення

    <button type="button" оnclick="alert(’click — 1’)">Click me</button>


  2. Підключення через атрибут onclick до знайденого Element

    <button id="button" type="button">Click me</button>
    const $button = document.getElementById("button");
    $button.onclick = function() {
    	alert("click — 2″);
    };


  3. Метод addEventListener()

    <button id="button" type="button">Click me</button>
    const $button = document.getElementById("button");
    $button.addEventListener("click", function() {
    	alert("click — 3″);
    });
    // у метода є третій необов’язковий параметр options, код нижче означає, що функція визветься тільки один раз
    const $buttonOnce = document.getElementById("button-once");
    $buttonOnce.addEventListener("click", function() {
    	alert("click — 3 once");
    }, {once: true});
    // зазначу, обробник з анонімною функцією неможливо відключити, для цього функція повинна мати ім’я
    $button.addEventListener("click", myFunction);
    // відключаємо
    $button.removeEventListener("click", myFunction);


  4. Спосіб з динамічним додаванням елементів у DOM

    <div id="wrapper"></div>
    const $wrapper = document.getElementById("wrapper");
    const $button = document.createElement("button“);
    $button.innerHTML = “Click me”;
    $button.addEventListener("click", function() {
    		alert("click — 4″);
    });
    $wrapper.append($button);


  5. Підвішування обробника на батьківський елемент

    Припустимо ми маємо декілька кнопок у компоненті, кожна з них має свою функцію — add, edit, delete.

    <div id="js-buttons">
    		<button class="js-add">Add</button>
    		<button class="js-edit">Edit</button>
    		<button class="js-delete">Delete</button>
    </div>
     
    const buttons = document.getElementById("js-buttons");
    buttons.addEventListener("click", function(event) {
    		const $target = event.target;
     
    		if ($target.classList.contains("js-add")) {
    			alert("click — add 5″);
    		} else if ($target.classList.contains("js-edit")) {
    			alert("click — edit 5″);
    		} else if ($target.classList.contains("js-delete")) {
    			alert("click — delete 5″);
    		};
    });


Висновки

Зараз ми можемо стверджувати, що живемо в еру JavaScript фреймворків. Проте, не потрібно поспішати та вчити фреймворки без впевнених знань чистого JavaScript. Багато проєктів по цей час використовують VanillaJS, що підкреслює важливість знання цієї базової технології.
Якщо знаєте методи про які я не написав, welcome в коментарі.
👍ПодобаєтьсяСподобалось5
До обраногоВ обраному4
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Я думаю стаття буде більш корисна початківцям, тому радив б автору добавити ще абзац, де б він описав ключову різницю між добавленням івента через addEventListener та onClick

Я маю практичний досвід використання популярних JavaScript фреймворків, таких як Vanilla.js, React та Vue.

Вообще называть vanilla.js фреймворком, как-то на голову не налазит.

Vanilla JS:

Vanilla JS is a fast, lightweight, cross-platform framework for building incredible, powerful JavaScript applications.

www.similarweb.com/website/vanilla-js.com/

Так, але хто забороняє повторювати це далі

JQuery калечит мозг бесповоротно. Или это тяжелое наследие PHP? А может, это такое суеверие — чем больше в коде знаков $, тем больше за него заплатят?

Також так пишу const $button, щоб позначити, що змінна $button містить HTMLElement, знак $ це згадка jQuery, jQuery колись використовувався усюди

У меня кровь из глаз от этих знаков $ в коде, что в PHP, что jQuery. Сложно придумать что-то более уродливое.

Можна ще додати, що тулзи типу chromе devtools показують які івенти навішені на елемент, якщо клікнути на цей елемент в табі Elements

Чудова збірка способів. Для початківців такі статті на вагу золота. Тим більше, від досвідчених розробників

Методи на кшталт — getElementsBy*** є застарілими.
Сучасні аналоги це querySelectorAll та querySelector.

Це для формошльопства застарілий, а так швидкодія у них різна

Наносекунды, которые спасают жизни!

копійка гривню береже. NASA місії на потужностях «тетріса» запускали, а тепер формочки доводиться на серверних суперкомп’ютерах рендерити з SSR, а то карманний вже не вивозить.

IDE частину методів підсвічує як застарілі, але наведений у статті метод document.getElementById досі актуальний на рівні з сучасними аналогами

А на каком оснований, интересно.
Кто их выпиливать будет — пол интернета ляжет без них.
Да и смысл какой, какая экономия.

Мой вопрос про IDE, с чего им писать про устаревание методов.
Думал может ты знаешь.

В IDE GoLand (за 2021 рік) ці методи актуальні:

document.getElementsByClassName
document.getElementsByTagName
document.getElementsByTagNameNS
document.getElementsByName
document.getElementById

А ці підсвічуються застарілими:

document.queryCommandEnabled
document.queryCommandValue
document.queryCommandIndeterm
document.queryCommandState
document.queryCommandSupported

Позначили застарілими бо ймовірно вже є краще рішення з гнучкішим API, а старе рішення зафіксували й перестали покращувати та оптимізовувати.

Погоджуюсь, що видаляти застарілі методи з JavaScript є помилкою

Використовував id для більш строгого вигляду, нічого проти querySelector не маю :)

querySelectorAll повертає статичний NodeList, а getElementsByClassName — динамічну HTMLCollection.Ну і швидкодія, про яку Dmitriy Mozgovoy вже написав.

Нетипова стаття на ДОУ, але...
1. Файно, що автор концентрується на базових навичках. В той час, коли багато курсів одразу вчать з умовного реакту, це плюс.
2. З пів року досвіду, автор вже намагається писати статті, відповідно документацію на проєктах теж почне. Мало хто це робить з відповідним бажанням маючи більше років досвіду. Варто це підтримати.
3. «Хочеш щось вивчити чи засвоїти, спробуй розповісти це іншим». Це не буде зайвим, як для самого автору, так і для інших розробників з невеликим досвідом.

Перша реакція комʼюніті зрозуміла. Стаття про доволі базові речі. І навіть у цьому коді є що порефакторити. Але відвертого хейту не заслуговує і варто на це подивитися з боку вищеописаних моментів

Дякую за коментар, стимул рости ще вище.

Файно, що автор концентрується на базових навичках

згоден

З пів року досвіду, автор вже намагається писати статті, відповідно документацію на проєктах теж почне. Мало хто це робить з відповідним бажанням маючи більше років досвіду. Варто це підтримати

що підтримати? Написання документації? Так, це правильно.

«Хочеш щось вивчити чи засвоїти, спробуй розповісти це іншим»

сорі, але це не універсальне правило. Якщо кожен, прочитавши будь-яку інфу, в тому числі найбазовішу, буде переказувати її у своїх власних статтях, інформаційний простір буде надзвичайно засмічений.
Яку нову інформацію доносить ця стаття? Може, там описана якась нетипова проблема і спосіб її рішення? Та ні. Нічого такого, чого нема тут, наприклад: developer.mozilla.org/...​pt/Building_blocks/Events
Я пропоную так: «Хочеш щось вивчити чи засвоїти, зроби практичну задачу на цю тему». Цей спосіб також чудово працює, і при цьому не заставляє витрачати час інших людей на читання банальностей.

Перша реакція комʼюніті зрозуміла. Стаття про доволі базові речі. І навіть у цьому коді є що порефакторити. Але відвертого хейту не заслуговує

хейтити не потрібно (до речі, я хейту тут в коментарях і не бачу, може підкажете, що я пропустив?), але і писати подібні «статті» також не треба.
Потрібно вказувати на недоліки, якщо вони є, а не заохочувати «так, молодець, все правильно робиш, тримай цукерку».

Наступна стаття автора «що таке div елемент».

Якщо у вас буде час то напишіть будь ласка метод підключення, який автор пропустив навмисно

Підписатись на коментарі