Решение Тату Ульманена правильное, но стоит обсудить почему. Вот своего рода быстрое объяснение того, что происходит, когда страница загружается
JavaScript и DOM - это две разные вещи. Короче говоря, DOM - это иерархическая структура данных, представляющая HTML-страницу, с которой API-интерфейс предоставляется JavaScript через такие объекты, как document
и другие.
DOM можно рассматривать как несбалансированное дерево с произвольным (не фиксированным) количеством узлов на любом уровне. Когда страница загружена, каждый узел / элемент / тег оценивается и присоединяется к дереву DOM в том порядке, в котором оно встречается. Когда встречается элемент script
, он полностью оценивается и выполняется перед оценкой остальной части HTML-документа.
Поскольку ваш узел script
находится перед узлом a
, на который он ссылается, узел a
еще не существует в дереве DOM, что и является причиной вашей проблемы. Перемещая элемент script
после узлов, на которые он ссылается (обычно внизу страницы перед закрывающим тегом body
), можно избежать этих типов ошибок. Другой распространенной практикой является использование события onload
в DOM; это откладывает выполнение любой функции, назначенной в качестве ее обработчика, до тех пор, пока вся HTML-страница не будет проанализирована / отображена в дереве DOM. Более поздний метод также позволяет вам включать ваш сценарий в любом месте страницы, которую вы хотите (например, в head
).