Спробуємо спочатку зрозуміти першопричину того, чому це відбувається в першу чергу.
Чому я отримую помилку або Uncaught TypeError: Не вдається встановити для властивості 'innerHTML' значення 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>