Путешествие по DOM - это как создание личного расписания

Если вы используете календарь для планирования своего дня, вы сможете понять основы DOM.

Вспомните, как вы впервые выучили HTML.

Кто-то (или какое-то программное обеспечение) должен был объяснить, как различные элементы работают вместе, чтобы вы могли создать свою первую веб-страницу.

Вероятно, они описали это как «коробки внутри коробок… внутри коробок…». в коробках… »

И этот базовый уровень понимания действительно очень хорошо помогает вам двигаться вперед! Но затем, как только вы освоитесь с CSS и перейдете к JavaScript ... ну, блоки внутри блоков больше не будут сокращать его.

JavaScript заставляет вас глубже понять DOM

Как только вы перейдете к JavaScript и jQuery, вам нужно будет понять объектную модель документа (DOM). DOM - это интерфейс прикладного программирования (API), который позволяет вам использовать JavaScript для внесения изменений в ваш HTML.

Это ключ к созданию динамических веб-сайтов и связыванию JavaScript и HTML во внешнем интерфейсе.

Обычно модель DOM называется деревом DOM. Такого рода работы для объяснения основной идеи, поскольку люди понимают идею ветвей деревьев и бесконечную иерархию этих ветвей.

Но аналогия все еще настолько проста, что вам будет сложно понять различные отношения между элементами в DOM.

Я хотел найти способ объяснить две ключевые концепции DOM:

  1. Сдерживание: родительские элементы содержат дочерние элементы. И эти дети содержат свои дочерние элементы.
  2. Порядок. Элементы DOM имеют определенный порядок, которым вы можете управлять.

Я обнаружил, что концепция личного календаря намного лучше показывает сложные отношения между элементами в DOM. Вот наглядное объяснение того, как использовать календарь для понимания DOM.

Чтобы понять это руководство, вам просто нужно понять классы и то, как настроить HTML-документ.

Основы обхода DOM

Вот краткая диаграмма первых трех месяцев 2018 года.

В этом случае год содержит три месяца, каждый из которых состоит из 4 недель.

Вот такая же концепция в HTML:

Каждый месяц - это div, у которого есть не только класс month, но также класс с конкретным name месяца. Это потому, что существует почти бесконечное количество лет, поэтому существует множество случаев каждого класса. Такая же структура используется в div с классом year в строке 1.

Кроме того, недели не имеют какого-либо конкретного идентификатора, кроме класса week. Вы поймете почему через мгновение.

Помимо использования классов и идентификаторов для доступа к элементам через DOM, мы также можем использовать отношения между элементами. На данный момент вам нужно знать три: ребенок, родитель и брат или сестра.

Дочерние элементы

Дочерний элемент: элемент, содержащийся в другом элементе.

Пример. Div january является дочерним годом 2018.

Родительские элементы

Родительский элемент: элемент, содержащий другие элементы.

Пример. 2018 - родительский год. Но январь также является родительским, потому что в нем 4 недели!

Родственные элементы

Родственный элемент: элемент, имеющий того же прямого родителя, что и другие элементы.

Пример. Все 4 недели в течение января являются братьями и сестрами друг друга.

Так в чем разница между DOM и реальным HTML, спросите вы?

Что ж, подумайте, как вы пользуетесь личным календарем. Это просто запись того, что вы делаете в течение своих дней. Это не настоящая деятельность! Другими словами, это модель того, что происходит в течение дня.

HTML - это актуальное содержание вашего дня. HTML-элементы составляют веб-страницу, а DOM - это доступный интерфейс для прямых изменений.

Вот несколько примеров, которые продемонстрируют эти концепции в действии.

Пример №1: Игра в футбол раз в неделю

Хорошо, мы собираемся показать, как вы представляете некоторые привычки реального мира в DOM. Вот сценарий: вы хотите играть в футбол один раз в неделю в январе.

В терминах HTML это означает, что нам нужно получить каждую из 4 недель января и изменить их содержание на «Играть в футбол».

Это может показаться глупым риторическим вопросом, но знаете ли вы, что общего у этих 4 div с классом week?

Ответ: все они дочерние элементы блока с классом january!

Итак, мы можем использовать следующий оператор в JavaScript, чтобы получить div с классом january:

document.getElementsByClassName('january');

Затем нам нужны все дочерние элементы этого div. Мы можем обновить предыдущий оператор с помощью свойства childNodes:

document.getElementsByClassName('january').childNodes;

Наконец, нам нужно использовать свойство nodeValue, чтобы изменить текст для каждого элемента. И нам нужно использовать цикл for для доступа к элементу с childNodes, поскольку он возвращает массив элементов. Итак, нам нужно пройтись по этому списку.

let weeks = document.getElementsByClassName('january').childNodes;
for(let i = 0; i< weeks.length; i++){
    weeks[i].nodeValue = "Play soccer";
}

Вот окончательный результат в HTML:

Здесь мы сделали две вещи:

  1. Обошел DOM - это означает, что мы использовали серию селекторов, чтобы получить нужные нам элементы: 4 week div
  2. Манипулировали DOM - мы фактически изменили текстовое содержимое в элементах HTML!

Пример № 2: Оплата счета по кредитной карте

Вот второй сценарий. Вам необходимо оплачивать счет по кредитной карте в течение первой недели каждого месяца (в данном случае всего три месяца).

В терминах HTML это означает, что нам нужно получить первый дочерний элемент каждого div с классом month. Затем вам нужно изменить значение на Счет оплачен.

Начнем так же, как в прошлый раз. Нам нужно получить каждый div с классом month.

document.getElementsByClassName('month');

Далее, в JavaScript действительно есть свойство firstChild. Таким образом, мы можем получить первого дочернего элемента каждого div с классом month.

document.getElementsByClassName('month').firstChild;

Вот как это выглядит:

Теперь, как и в прошлый раз, нам нужно сразу изменить значение всех этих week div на значение Bill payed.

document.getElementsByClassName('month')
.firstChild.nodeValue = "Bill payed";

Между прочим, наличие оператора JavaScript в двух строках не имеет значения, если только одна точка с запятой.

Окончательный HTML:

Посмотрите, как мы можем обновлять элементы в масштабе, основываясь только на имени класса? Довольно мощный.

Пример № 3: Уход в отпуск на неделю

Вот сценарий. Допустим, это ваш рабочий календарь, и вы хотите указать, что вторую неделю февраля вы возьмете отпуск, чтобы поехать в отпуск с семьей.

В терминах HTML это означает, что вам нужно выбрать второй дочерний элемент div февраля и изменить значение на Отпуск.

В прошлый раз мы использовали свойство firstChild из JavaScript. Но второго дочернего свойства нет! Вместо этого мы собираемся использовать свойство childNodes, как в первом примере.

childNodes возвращает массив всех дочерних элементов родительского элемента. Если вы еще не знакомы с массивами, прочтите мое руководство здесь. Хорошей новостью является то, что вы можете выбирать определенные элементы, используя фигурные скобки [ ], как и любой другой массив.

Поскольку массивы имеют индекс 0, нам нужно выбрать элемент с индексом 1, который является вторым элементом.

document.getElementsByClassName('february').childNodes[1];

И тогда нам просто нужно изменить значение.

document.getElementsByClassName('february') .childNodes[1].nodeValue= 'Vacation';

И последний HTML.

childNodes просто применяет структуру массива, которую вы, вероятно, уже знаете, к DOM, чтобы вы могли манипулировать HTML.

Призыв к действию

Вам понравилось это? Если вы хотите получать уведомления, когда я буду выпускать будущие руководства, в которых используются аналогии, зарегистрируйтесь здесь.