Vanilla js, как проверить, существует ли элемент html перед выполнением скрипта

эй, я пытаюсь понять, как заставить мой сценарий ждать, выполняя его часть, пока элемент загружается, но в настоящее время он в основном просто передает его и не ждет его. Как лучше всего это сделать в vanilla js?

это код

this.heading = document.getElementById("heading");

что я хочу, чтобы он подождал, или повторяю проверку, пока заголовок не появится наверняка каждый раз

Спасибо

Как он загружается?

Ben West 31.03.2018 18:46

у меня есть html-файл, который загружается в индекс по хешу, и этот скрипт не ждет, пока он загрузит весь код, который можно увидеть здесь: github.com/benonymus/vanilla-js-mvc-with-routing2

jhonathan myers 31.03.2018 18:49

Звучит как работа для наблюдателя за мутациями.

Josan Iracheta 01.04.2018 02:23

IMHO предложение, сделанное @JosanIracheta, - лучшее и более элегантное решение этой проблемы. Пример можно найти на developer.mozilla.org/en-US/docs/Web/API/…

sflr 13.01.2019 08:07
Поведение ключевого слова "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) для оценки ваших знаний,...
2
4
1 392
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы можете неоднократно проверять заголовок, а затем что-то с ним делать, как только он будет получен таким образом.

var heading;

function getHeading() {
    var interval = setInterval(function() {
        if (heading = document.getElementById('heading')) {
            clearInterval(interval);
            console.info(heading);
            // do some stuff here with your heading
        }
    }, 100);  // 100 represents how often the script checks for existence of heading in ms
}

getHeading();

@JonasWilms: что было бы правильным способом сделать это в случае страницы на стороннем веб-сайте?

sflr 13.01.2019 07:35

Сделайте это после загрузки вашего шаблона. Повторная проверка, если что-то произошло (опрос), обычно является плохой идеей. Это должно произойти так как загруженного шаблона. В вашем случае это похоже на goToRoute:

goToRoute: function (htmlName) {
    (function(scope) { 
        var url = 'views/' + htmlName,
            xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function () {
            if (this.readyState === 4 && this.status === 200) {
                scope.rootElem.innerHTML = this.responseText;

                // Now it's ready

            }
        };
        xhttp.open('GET', url, true);
        xhttp.send();
    })(this);
}

Возможно, не имеет смысла помещать конкретный код, о котором вы думаете, в goToRoute; чтобы сделать его более универсальным, вы можете подумать о том, чтобы заставить goToRoute принимать параметр обратного вызова или использовать события.

Да. Определенно. А теперь небольшой пример того, что вы имели в виду в своем последнем предложении, и ответ заслуживает поддержки :)

Jonas Wilms 31.03.2018 18:54

да, это кажется интересным, но как мне сохранить mvc в целости и сохранности?

jhonathan myers 31.03.2018 19:16

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