ItBursa. Блок первый


Видео #3. Изменение HTML с помощью JavaScript

Ищем нужный элемент

document.querySelector("css-selector");

Возвращает один элемент, если элементов несколько, возвращает первый

Близкий по смыслу селектор

document.querySelectorAll("css-selector");

Возвращает массив из всех найденных элементов.
Для существующего на странице элемента

document.querySelector("css-selector") == document.querySelectorAll("css-selector")[0]

Для несуществующего элемента есть различие:

document.querySelector("css-selector"); вернёт null
document.querySelectorAll("css-selector"); вернёт отсутствующий элемент массива, т.е undefined

Стилизуем элемент

element.style.backgroundColor = "red";

Для сравнения: как записываются свойства в css и js

css: background-color
js: backgroundColor

Для свойств, состоящих из одного слова, различий нет

element.style.width = "500px";
element.style.border = "solid black 5px";

Добавляем элемент на страницу

element.innerHTML = "text";

Доступ JS к HTML

Чтобы js мог изменить html-элемент, последний должен присутствовать не только в разметке, но и на странице. То есть на момент срабатывания js-кода страница уже должна загрузиться. Как этого добиться

1. подключать js в конце страницы перед закрывающим </body>
2. подключить js с параметром defer
    <script src="script.js" defer></script>
Скрипт с defer сработает только когда весь html-документ будет обработан браузером
3. Начинать код с конструкции
window.addEventListener("load", function(){
    здесь код
});
Она означает, что код начнёт выполняться только когда произойдёт событие load - загрузка.

Видео #4. Введения в события в JavaScript 

element.addEventListener("click", function(){ ... });

Всплытие событий

Подробнее: https://learn.javascript.ru/event-bubbling
Несколько дивов 1, 2, 3 вложены друг в друга.

  <div class="block3">
       <div class="block2">
           <div class="block1"></div>
       </div>
   </div>



У каждого из них есть свой обработчик событий. Если кликнуть по самому внутреннему диву, сработает его обработчик, потом обработчик дива 2, потом дива 3, потом body и html, если у них были события. Произошло всплытие.

Чтобы запретить всплытие, используется команда

event.stopPropagation();

Эта команда запрещает элементу уведомлять о событии остальных.
Команда существует, но использовать её без особой необходимости не рекомендуется

Команда

event.stopImmediatePropagation();

Прекращает обработку событий, которые находятся ниже по коду 

Кроме события всплытия есть событие погружения.
Т.е, когда кликаем по диву 1, обработчик проверяет нет ли события у html, потом у body, потом у дива 3, 2 и наконец доходит до дива 1. Это называется погружение. После погружения в обратном порядке идёт всплытие.

По умолчанию addEventListener работает на всплытие. Чтобы изменить это поведение дописываем true

element.addEventListener("click", function(){ ... }, true);

Теперь при клике по body будут менять цвет вложенные блоки.

Элемент, который вызывает событие, доступен как event.target. this - элемент, на котором событие произошло. event.target и this могут быть одним элементом и разными.