Готовность DOM в Javascript

Готовность DOM в Javascript

20 октября 2022 г.

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

<!DOCTYPE HTML>
<html>
    <head>
        <script type="text/javascript">
            document.querySelector('#button').addEventListener('click', () => {
                console.log('You clicked me!')
            });
        </script>
    </head>
    <body>
        <button id="button">Click Me</button>
    </body>
</html>

Несмотря на то, что есть кнопка с идентификатором #button, этот код на самом деле выдает ошибку. Причина в том, что Javascript загружается до DOM. Поэтому попытка запроса select для #button возвращает null:

Uncaught TypeError: Cannot read properties of null (reading 'addEventListener')
    at file.html:5:46

Это довольно распространенная проблема, связанная с готовностью DOM: ваш HTML DOM не загружен, поэтому он не готов к применению к нему Javascript.

Ожидание готовности DOM в Javascript

Если вы хотите дождаться загрузки HTML перед запуском Javascript, попробуйте использовать DOMContentLoaded. Мы можем обернуть весь наш Javascript в этот прослушиватель событий следующим образом:

window.addEventListener('DOMContentLoaded', () => {
    document.querySelector('#button').addEventListener('click', () => {
        console.log('You clicked me!')
    });
});

Теперь в вашем коде не будет возникать ошибок, поскольку код в прослушивателе событий DOMContentLoaded будет срабатывать только после запуска HTML. Это означает, что вы можете по-прежнему использовать свой Javascript перед HTML и не сталкиваться с проблемами. Конечно, вы также можете решить эту проблему, поместив свой Javascript после вашего HTML, но это не всегда возможно.

Надеюсь, вам понравилось это краткое руководство по готовности к DOM и DOMContentLoaded в Javascript.


Также опубликовано здесь


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE