Как правильно работать с DOM-элементами в JS?

Ссылка скопирована
1 ответ

Какие практики рекомендуется использовать при работе с элементами, чтобы в случае их отсутствия на странице код не "упал"? Например, есть следующий псевдокод:

async function getData() {   const { hash } = window.location;    if (!hash) return;    const card = document.querySelector(`[data-id="${hash.substring(1)}"]`);    if (!card) return;    const { url } = card.dataset;    if (!url) return;    const response = await fetch(url);   const data = await response.json();    return data; }

async function getData() { const { hash } = window.location; if (!hash) return; const card = document.querySelector(`[data-id="${hash.substring(1)}"]`); if (!card) return; const { url } = card.dataset; if (!url) return; const response = await fetch(url); const data = await response.json(); return data; }

Это нормально использовать на каждом шаге проверки на наличие элемента, атрибута и т.д.? Может есть другие подходы? Использовать try...catch?

Дополнительно:

document.querySelector('.foo')?.offsetHeight

  • Как минимум вы упустили проверку для
    const data = await response.json();
    Потому что не всегда может быть в ответе json в силу разных обстоятельств.

    Если вам не особо важна обработка каждой переменной, то вместо всех проверок можно просто запихнуть код в try...catch. Но я не эксперт, просто предлагаю варианты.

  • Свойство hash у объекта location всегда присутствует. Может быть пустой строкой.
    querySelector вернет null если ничего не найдет.
    Таким образом половину проверок можно заменить одним вопросительным знаком:

    async function getData() {     const url = document         .querySelector(`[data-id="${window.location.hash.substring(1)}"]`)         ?.dataset.url; // Вот здесь этот спасительный знак =)      if (!url) return;      const response = await fetch(url);     const data = await response.json();      return data; }

    async function getData() { const url = document .querySelector(`[data-id="${window.location.hash.substring(1)}"]`) ?.dataset.url; // Вот здесь этот спасительный знак =) if (!url) return; const response = await fetch(url); const data = await response.json(); return data; }

    • То есть по сути всё сводится к использованию оператора опциональной последовательности. Ок.
    • Сергей, в данном случае да.
    • Ещё вопрос вдогонку. Правильно ли я понимаю, что следующая проверка длины излишняя, если в дальнейшем планируются использоваться исключительно методы или свойства NodeList?
      function handleButtons() {   const buttons = document.querySelectorAll('.btn');    if (!buttons.length) return; // строка лишняя, так как forEach на пустом NodeList не выбрасывает исключений    buttons.forEach(...); }

      function handleButtons() { const buttons = document.querySelectorAll('.btn'); if (!buttons.length) return; // строка лишняя, так как forEach на пустом NodeList не выбрасывает исключений buttons.forEach(...); }

    • Сергей, здесь эта проверка не нужна. Если коллекция пустая, то forEach просто ни разу не отработает.
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Юрий Linux Ответ

    Для работы с DOM-элементами в JavaScript существует несколько методов и подходов, которые могут помочь вам управлять элементами на веб-странице. Вот некоторые из них:

    1. Получение элемента по ID:
    Для того чтобы получить элемент по его идентификатору, вы можете использовать метод document.getElementById(). Например:

    var element = document.getElementById('myElementId');

    var element = document.getElementById('myElementId');

    2. Получение элемента по классу:
    Если вам нужно получить все элементы с определенным классом, вы можете использовать метод document.getElementsByClassName(). Например:

    var elements = document.getElementsByClassName('myClass');

    var elements = document.getElementsByClassName('myClass');

    3. Получение элемента по тегу:
    Для того чтобы получить все элементы с определенным тегом, вы можете использовать метод document.getElementsByTagName(). Например:

    var elements = document.getElementsByTagName('div');

    var elements = document.getElementsByTagName('div');

    4. Работа с атрибутами элементов:
    Чтобы получить или установить значение атрибута элемента, вы можете использовать свойства элемента, например element.getAttribute() и element.setAttribute(). Например:

    var value = element.getAttribute('data-id');
    element.setAttribute('data-id', '12345');

    var value = element.getAttribute('data-id'); element.setAttribute('data-id', '12345');

    5. Изменение содержимого элемента:
    Чтобы изменить содержимое элемента, вы можете использовать свойство innerHTML. Например:

    element.innerHTML = 'Новый текст';

    element.innerHTML = 'Новый текст';

    6. Добавление и удаление классов:
    Для добавления или удаления класса у элемента, вы можете использовать методы element.classList.add() и element.classList.remove(). Например:

    element.classList.add('newClass');
    element.classList.remove('oldClass');

    element.classList.add('newClass'); element.classList.remove('oldClass');

    7. Добавление обработчиков событий:
    Для добавления обработчиков событий к элементу, вы можете использовать метод addEventListener(). Например:

    element.addEventListener('click', function() {
      // Ваш код обработчика события
    });

    element.addEventListener('click', function() { // Ваш код обработчика события });

    Это лишь некоторые из способов работы с DOM-элементами в JavaScript. Помните, что работа с DOM может быть иногда сложной, особенно при работе с большим количеством элементов. Используйте эти методы с умом и они помогут вам создавать динамические и интерактивные веб-приложения.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно