Давайте сначала попытаемся понять первопричину того, почему это происходит.
Почему я получаю сообщение об ошибке или Uncaught TypeError: Cannot set property 'innerHTML' of null?
Браузер всегда загружает всю HTML-модель DOM сверху вниз. Любой код JavaScript, написанный внутри scriptтегов (присутствующих в headразделе вашего HTML-файла), выполняется механизмом рендеринга браузера даже до того, как будет загружена вся ваша DOM (различные теги элементов HTML, присутствующие в теге body). Сценарии, представленные в headтеге, пытаются получить доступ к элементу, имеющему идентификатор, helloеще до того, как он был фактически отображен в DOM. Очевидно, что JavaScript не смог увидеть элемент, и, следовательно, вы увидите ошибку нулевой ссылки.
Как заставить его работать как раньше?
Вы хотите, чтобы сообщение «привет» отображалось на странице, как только пользователь заходит на вашу страницу в первый раз. Поэтому вам нужно подключить свой код в тот момент, когда вы полностью уверены в том, что DOM полностью загружен и helloэлемент id доступен / доступен. Это возможно двумя способами:
- Измените порядок ваших скриптов : таким образом ваши скрипты запускаются только после того, как DOM, содержащий ваш
helloэлемент id, уже загружен. Вы можете добиться этого, просто переместив тег скрипта после всех элементов DOM, то есть внизу, где bodyтег заканчивается. Поскольку рендеринг происходит сверху вниз, ваши скрипты выполняются в конце, и вы не сталкиваетесь с ошибкой.
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Untitled Document</title>
</head>
<body>
<div id="hello"></div>
<script type ="text/javascript">
what();
function what(){
document.getElementById('hello').innerHTML = 'hi';
};
</script>
</body>
</html>
- Использовать перехват событий : механизм визуализации браузера предоставляет перехватчик событий на основе
window.onloadсобытия, который дает вам подсказку, что браузер завершил загрузку DOM. Поэтому к тому времени, когда это событие запускается, вы можете быть уверены, что ваш элемент с helloидентификатором, уже загруженным в DOM, и любой JavaScript, запущенный после этого, который пытается получить доступ к этому элементу, не потерпит неудачу. Итак, вы делаете что-то вроде фрагмента кода ниже. Обратите внимание, что в этом случае ваш скрипт работает, даже если он находится в верхней части вашего HTML-документа внутри headтега.
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Untitled Document</title>
<script type ="text/javascript">
window.onload = function() {
what();
function what(){
document.getElementById('hello').innerHTML = 'hi';
};
}
</script>
</head>
<body>
<div id="hello"></div>
</body>
</html>