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