Цикл JavaScript выполняется на консоли, но не в коде

Я пытаюсь создать цикл JS forEach, который должен запускаться после полной загрузки DOM, но по какой-то причине он не запускается в коде, но когда я помещаю тот же цикл на консоль, он работает нормально.

window.onload = (event) => {

    var checkboxes = document.getElementsByName("plates")
    var labelPlate = document.getElementsByName("labelPlate")

    checkboxes.forEach((i, index) => {
        if (i.checked) {

            labelPlate[index].classList.add("active")
        } else {
            labelPlate[index].classList.remove("active")
        }
    })
};

Цикл должен работать.

Флажки загружаются динамически? Возможно, они еще не загружены во время выполнения этого кода.

Barmar 30.07.2024 23:51

Откуда ты знаешь, что «он не запустится»?

zerkms 30.07.2024 23:51

У вас есть несколько window.onload заданий? Будет работать только последний, поскольку они перезаписывают друг друга. Используйте window.addEventListener(), чтобы добавить несколько обработчиков.

Barmar 30.07.2024 23:52

Хотя getElementsByName действительно возвращает живой NodeList и, следовательно, имеет метод forEach, этот метод был добавлен позже, поэтому в более старом браузере он может быть реализован неправильно. Трудно сказать без HTML, на котором работает код. Используйте Фрагмент стека, чтобы сделать ваш код работоспособным здесь, в Stack Overflow.

Heretic Monkey 31.07.2024 00:06

@HereticMonkey Если метод не реализован, вы получите сообщение об ошибке. И в консоли это тоже не сработает.

Barmar 31.07.2024 00:29

@Barmar Спасибо за очевидность вашего ответа. Это служит полезным сопоставлением с тем, что на самом деле говорится в моем комментарии, а именно: «в старом браузере это может быть реализовано неправильно». И реализации могут различаться в консоли и браузере.

Heretic Monkey 31.07.2024 01:32
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Причина, по которой код работает в консоли, а не при непосредственном внедрении в вашу страницу, скорее всего, заключается в том, что элементы, которые вы ищете, динамически добавляются на страницу после возникновения события загрузки.

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

Вам необходимо изменить свой код, чтобы он запускался после добавления динамических элементов (что происходит ПОСЛЕ первоначальной загрузки базового html-документа).

Чтобы добавить к ответу @Lonnie:

Вам необходимо изменить свой код, чтобы он запускался после добавления динамических элементов (что происходит ПОСЛЕ первоначальной загрузки базового html-документа).

У вас есть несколько вариантов:

  • Загрузите свой скрипт в конце документа, если он статический, а не <head>.
  • Подождите успешного события от вашей платформы (поскольку вы здесь не упомянули ничего подобного, я дам вам независимый от платформы ответ)
    • В конце части вашего кода, которая генерирует ваши plates и labels, сделайте следующее: (чтобы запустить событие complete)
      const myCompleteEvent = new Event("plates-loaded");
      document.dispatchEvent(myCompleteEvent);
      
    • Используйте это так:
      document.addEventListener("plates-loaded", () => {
         const checkboxes = document.getElementsByName("plates");
         const labelPlate = document.getElementsByName("labelPlate");
      
         checkboxes.forEach((c, i) => {
           labelPlate[i].classList.toggle("active", c.checked);
         });
      });
      

Также очистил ваш код, используя classList.toggle вместо add/remove :)

В чем существенная разница между onload и ожиданием ReadyState == 'complete'?

Barmar 31.07.2024 00:26

Я дважды проверил свой ответ и думаю, что он неверен. Я скорректировал его, чтобы теперь он работал с использованием событий завершения :) Спасибо за этот улов @Barmar!

AP. 31.07.2024 00:33

Вам действительно нужно событие для этого? Просто используйте обычную функцию и вызывайте ее после загрузки элементов. Или просто поместите код в вопрос после загрузки элементов.

Barmar 31.07.2024 00:35

Это правда, но это делает несколько предположений о доступе к коду и взаимодействии. Я предлагал обобщенный способ работы с независимым кодом на обоих концах, который просто позволял чему-либо «подключаться» к состоянию завершения.

AP. 01.08.2024 01:18

Другие вопросы по теме