Неможливо встановити властивість 'innerHTML' для null


97

Чому я отримую помилку або Uncaught TypeError: Не вдається встановити для властивості 'innerHTML' значення null? Я думав, що розумію innerHTML і працював раніше.

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Untitled Document</title>

<script type ="text/javascript">
    what();
    function what(){
        document.getElementById('hello').innerHTML = 'hi';
    };
</script>

</head>

<body>
<div id="hello"></div>
</body>
</html>

Відповіді:


170

Ви повинні розмістити hellodiv перед сценарієм, щоб він існував під час завантаження сценарію.


17
Якщо ви використовуєте window.onload = ім'я функції () {}, не має значення, чи є div перед або після.
Colyn1337

1
Хрусткий розчин. Але я все ще отримую помилку. In chrome / fedora 25 / apache
Sahu V Kumar

у мене ця проблема, я додаю код в useEffect, але я отримав помилку !! як я можу зробити ? useLayoutEffect (() => {const elemNext = document.querySelector ("# infinite-carousel> button.InfiniteCarouselArrow.InfiniteCarouselArrowNext"); elemNext.innerHTML = "next"; × TypeError: неможливо встановити властивість 'innerHTML' of null null elementHTML 'HTML = "наступний";
Моштаба Дарзі

48

Спробуємо спочатку зрозуміти першопричину того, чому це відбувається в першу чергу.

Чому я отримую помилку або Uncaught TypeError: Не вдається встановити для властивості 'innerHTML' значення null?

Браузер завжди завантажує весь HTML DOM зверху вниз. Будь-який код JavaScript, написаний всередині scriptтегів (присутній у headрозділі вашого HTML-файлу), виконується механізмом візуалізації браузера ще до того, як завантажується весь DOM (різні теги елементів HTML, що містяться в тезі body). Сценарії, присутні в headтезі, намагаються отримати доступ до елемента, що має ідентифікатор, helloще до того, як він фактично був відображений у DOM. Очевидно, що JavaScript не побачив елемент, і, отже, ви в кінцевому підсумку бачите нульову помилку посилання.

Як ви можете змусити це працювати як раніше?

Ви хочете показати повідомлення "привіт" на сторінці, як тільки користувач вперше потрапить на вашу сторінку. Тому вам потрібно підключити свій код в той момент, коли ви повністю впевнені в тому, що DOM повністю завантажений, а helloелемент id доступний / доступний. Це можна досягти двома способами:

  1. Змініть порядок своїх сценаріїв . Таким чином ваші сценарії запускаються лише після того, як 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>

  1. Використовуйте підключення подій : механізм візуалізації браузера надає підключення на основі 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>


Хороші речі, але я б додав, я не думаю, що функція, яка робить document.getElementById (..). InnerHTML. потрібно помістити в навантаження. Оскільки це може завантажуватися до завантаження DOM, і помилок немає. Повинен бути лише його дзвінок. jsfiddle.net/fbz6wLpd/8
barlop

40

Ви можете сказати javascript виконати дію "onload" ... Спробуйте з цим:

<script type ="text/javascript">
window.onload = function what(){
document.getElementById('hello').innerHTML = 'hi';
};
</script>

11

Просто вставте свій JS window.onload

window.onload = function() {

        what();

        function what() {
            document.getElementById('hello').innerHTML = 'hi';
        };

    }

7

Частина JavaScript повинна запускатися після завантаження сторінки, тому рекомендується розміщувати сценарій JavaScript у кінці тегу body.

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Example</title>

</head>
<body>
<div id="hello"></div>
<script type ="text/javascript">
    what();
    function what(){
        document.getElementById('hello').innerHTML = 'hi';
    };
</script>  
</body>
</html>


2
Чи не припините ви, будь ласка, великі літери кожного слова, яке введете?
VortexYT

6

Javascript виглядає добре. Спробуйте запустити його після завантаження div. Спробуйте запустити лише тоді, коли документ готовий. $(document).readyу jquery.


1
також атрибут type у тегах скриптів застарів.
JT Nolan

2
і імпорт jquery для вирішення цього є надмірним, якщо ви не плануєте використовувати його для цього проекту тут, далі. window.onloadможе бути достатньо, але є й інші події. Посилання на MDN на window: developer.mozilla.org/en-US/docs/Web/API/Window
Sgnl

5

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Example</title>

</head>
<body>
<div id="hello"></div>
<script type ="text/javascript">
    what();
    function what(){
        document.getElementById('hello').innerHTML = '<p>hi</p>';
    };
</script>  
</body>
</html>


Ваша відповідь правильна, але я можу попросити вас додати якийсь контекст навколо вашого вихідного коду. Відповіді лише за кодами важко зрозуміти. Це допоможе автору запиту та майбутнім читачам, якщо ви зможете додати більше інформації у своєму дописі.
RBT

3

Ось мій фрагмент спробуйте. Я сподіваюся, це допоможе вам.

<!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>


3

Ви можете спробувати скористатися методом setTimeout, щоб переконатися, що ваш html завантажується спочатку.


3

Основною причиною є: HTML на сторінці повинен бути завантажений перед кодом javascript . Вирішення двома способами:

1) Дозволити завантаження HTML перед js-кодом.

<script type ="text/javascript">
    window.onload = function what(){
        document.getElementById('hello').innerHTML = 'hi';
    }
</script>

//or set time out like this:
<script type ="text/javascript">
    setTimeout(function(){
       what();
       function what(){
          document.getElementById('hello').innerHTML = 'hi';
       };
    }, 50);
    //NOTE: 50 is milisecond.
</script>

2) Перемістіть код js під HTML-код

<div id="hello"></div>
<script type ="text/javascript">
    what();
    function what(){
        document.getElementById('hello').innerHTML = 'hi';
    };
</script>

1

<!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>


проблема в тому, що кулак html div завантажений .. ніж функція скрипта Java, яка викликає зараз це працює ...
user2114253

1

У мене була та сама проблема, і виявляється, що нульова помилка була тому, що я не зберегв html, з яким працював.

Якщо елемент, про який йдеться, не був збережений після завантаження сторінки, означає "нуль", оскільки документ не містить його на момент завантаження. Використання window.onload також допомагає налагоджувати.

Сподіваюсь, це було вам корисно.


1

Ця помилка може з'явитися, навіть якщо ви завантажуєте свій сценарій після завершення обробки HTML. У цьому прикладі ваш код

<div id="hello"></div>

не має значення всередині div. Отже, помилка піднімається, бо всередині немає значення, яке потрібно змінити. Це мало бути

<div id="hello">Some random text to change</div>

тоді.


0

Додайте jquery в < head>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>

Використовуйте $ document.ready () : код може бути в < head>окремому файлі, наприклад main.js

1) використання js у тому ж файлі (додайте це в < head>):

<script>
$( document ).ready(function() {
function what(){
    document.getElementById('hello').innerHTML = 'hi';
};
});
</script>

2) за допомогою іншого файлу, такого як main.js (додайте це в < head>):

<script type="text/javascript" src="/path/to/main.js" charset="utf-8"></script>

і додайте код у файл main.js :)


0

Вам потрібно переодягнутися divв p. Технічно innerHTML означає, що він знаходиться всередині <??? id=""></???>деталі.

Зміна:

<div id="hello"></div>

в

<p id="hello"></p>

Робити:

document.getElementById('hello').innerHTML = 'hi';

повернеться

<div id="hello"></div> into this <div id="hello">hi</div>

що насправді не має сенсу.

Ви також можете спробувати змінити:

document.getElementById('hello').innerHTML = 'hi';

в це

document.getElementById('hello').innerHTML='<p> hi </p> ';

щоб це працювало.


0

Помилка сама собою пояснюється тим, що не отримує тег HTML, в якому Ви хочете встановити Дані. Отже, зробіть тег доступним для JS, тоді лише Ви можете встановити Дані для цього.


0

Без сумніву, більшість відповідей тут правильні, але ви також можете зробити це:

document.addEventListener('DOMContentLoaded', function what() {
   document.getElementById('hello').innerHTML = 'hi';  
});

0

Існують різні можливі причини, як ми обговорювали, хотіли б просто додати це для когось, хто може мати таку ж проблему, як моя.

У моєму випадку у мене відсутній закритий div, як показано нижче

   <!DOCTYPE HTML>
   <html>
   <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   <title>Untitled Document</title>
   </head>
   <body>
   <div> //I am an open div
    <div id="hello"></div>
   <script type ="text/javascript">
       what();
       function what(){
          document.getElementById('hello').innerHTML = 'hi';
       };
   </script>
   </body>
   </html>

Відсутність закритого div може призвести до дезорганізації трансверсали від дочірнього до батьківського або батьківського до дочірнього, отже, наслідком помилки при спробі отримати доступ до елемента в DOM


Будь ласка, дайте відповідь згідно з прикладом ОП
mishsx

@mishsx причина моєї відповіді: у мене була точно така ж помилка, і коли я шукав, я бачив виправлення всіх, але це не було виправленням у моєму випадку, запитання того самого питання дублюється, я відчував, що хтось інший міг бути в точному та сама ситуація теж, і я вирішив опублікувати власну помилку та виправити як repl ... як ви бачите, це чітко зазначено у відповіді, отже, це буде корисно для тих, хто в точно такій же ситуації, і все ж зрозуміло для інших, що це не Виправлення помилки у питанні. Якщо це не нормально, будь ласка, порадьтесь, як мені зробити помилку та виправити помилку, не дублюючи
Proxybee

0

Нехай DOM завантажується. Щоб зробити щось у DOM, спочатку потрібно завантажити його. У вашому випадку спочатку потрібно завантажити <div>тег. тоді вам є що змінити. якщо ви спочатку завантажуєте js, тоді ця функція прагне HTMLзробити те, що ви просили зробити, але коли цей час HTMLзавантажується, і ваша функція не може знайти файл HTML. Таким чином, ви можете розмістити сценарій внизу сторінки. всередині <body>тегу, то функція може отримати доступ, <div>оскільки DOM вже завантажується під час натискання на сценарій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.