Давайте сначала попытаемся понять первопричину того, почему это происходит.
Почему я получаю сообщение об ошибке или 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>