Nie można ustawić właściwości „innerHTML” na wartość null

99

Dlaczego otrzymuję komunikat o błędzie lub Uncaught TypeError: Nie można ustawić właściwości „innerHTML” na wartość null? Myślałem, że rozumiem innerHTML i już wcześniej to działało.

<!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>
Joshua W.
źródło

Odpowiedzi:

177

Musisz umieścić element hellodiv przed skryptem, aby istniał podczas ładowania skryptu.

Erik Godard
źródło
18
Jeśli używasz window.onload = nazwa funkcji () {}, nie ma znaczenia, czy element div znajduje się przed, czy po.
Colyn1337
1
Chrupiące rozwiązanie. Ale nadal otrzymuję błąd. W chrome / fedora 25 / apache
Vishal Kumar Sahu
51

Najpierw spróbujmy zrozumieć pierwotną przyczynę, dlaczego tak się dzieje.

Dlaczego otrzymuję komunikat o błędzie lub Uncaught TypeError: Nie można ustawić właściwości „innerHTML” na wartość null?

Przeglądarka zawsze ładuje cały HTML DOM od góry do dołu. Każdy kod JavaScript zapisany w scripttagach (obecny w headsekcji twojego pliku HTML) jest wykonywany przez silnik renderujący przeglądarki nawet przed załadowaniem całego DOM (różne tagi elementów HTML obecne w tagu body). Skrypty obecne w headtagu próbują uzyskać dostęp do elementu posiadającego id, hellonawet zanim został on faktycznie wyrenderowany w DOM. Więc oczywiście JavaScript nie dostrzegł elementu i dlatego w końcu pojawia się błąd zerowego odwołania.

Jak sprawić, by działało jak wcześniej?

Chcesz, aby komunikat „cześć” był wyświetlany na stronie, gdy tylko użytkownik wyląduje na Twojej stronie po raz pierwszy. Musisz więc podłączyć swój kod w momencie, gdy jesteś całkowicie pewien, że DOM jest w pełni załadowany, a helloelement id jest dostępny / dostępny. Można to osiągnąć na dwa sposoby:

  1. Zmień kolejność skryptów : w ten sposób skrypty będą uruchamiane dopiero po hellozaładowaniu DOM zawierającego element id. Możesz to osiągnąć, po prostu przesuwając tag script za wszystkimi elementami DOM, tj. Na dole, gdzie bodykończy się tag. Ponieważ renderowanie odbywa się od góry do dołu, skrypty są wykonywane na końcu i nie napotkasz żadnego błędu.

    <!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. Użyj przechwytywania zdarzeń : silnik renderujący przeglądarki zapewnia window.onloadprzechwytywanie oparte na zdarzeniach przez zdarzenie, które daje wskazówkę, że przeglądarka zakończyła ładowanie DOM. Więc do czasu, gdy to zdarzenie zostanie uruchomione, możesz mieć pewność, że Twój element o helloidentyfikatorze już załadowany do DOM i jakikolwiek uruchomiony później JavaScript, który próbuje uzyskać dostęp do tego elementu, nie zawiedzie. Robisz więc coś takiego jak poniższy fragment kodu. Zwróć uwagę, że w tym przypadku skrypt działa, mimo że znajduje się na górze dokumentu HTML wewnątrz headtagu.

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

RBT
źródło
Dobra rzecz, ale dodałbym, nie sądzę, że funkcja, która robi document.getElementById (..). InnerHTML. musi być umieszczony w ramach obciążenia. Ponieważ może to zostać załadowane przed załadowaniem DOM i nie ma błędu. Musi być tylko jego wezwanie. jsfiddle.net/fbz6wLpd/8
barlop
40

Możesz nakazać javascriptowi wykonanie akcji „onload” ... Spróbuj z tym:

<script type ="text/javascript">
window.onload = function what(){
document.getElementById('hello').innerHTML = 'hi';
};
</script>
Colyn1337
źródło
11

Po prostu włóż swój JS window.onload

window.onload = function() {

        what();

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

    }
RIYAJ KHAN
źródło
7

Część JavaScript musi zostać uruchomiona po załadowaniu strony, dlatego zaleca się umieszczenie skryptu JavaScript na końcu tagu 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>

user5323957
źródło
2
Czy możesz przestać pisać wielką literą każde wpisane słowo?
VortexYT,
6

Javascript wygląda dobrze. Spróbuj uruchomić go po załadowaniu elementu div. Spróbuj uruchomić tylko wtedy, gdy dokument jest gotowy. $(document).readyw jQuery.

JT Nolan
źródło
1
również atrybut type w znacznikach skryptu jest przestarzały.
JT Nolan
2
a importowanie jquery w celu rozwiązania tego problemu jest przesadą, chyba że planujesz użyć go w tym projekcie. window.onloadmoże wystarczyć, ale dostępne są również inne wydarzenia. window
Odniesienie
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>

user6175882
źródło
Twoja odpowiedź jest prawidłowa, ale czy mogę prosić o dodanie kontekstu do Twojego kodu źródłowego. Odpowiedzi zawierające tylko kod są trudne do zrozumienia. Pomoże to pytającemu i przyszłym czytelnikom, jeśli możesz dodać więcej informacji w swoim poście.
RBT
3

Oto mój fragment, spróbuj. Mam nadzieję, że to ci pomoże.

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


źródło
3

Możesz spróbować użyć metody setTimeout, aby upewnić się, że kod HTML zostanie załadowany jako pierwszy.

Wir
źródło
3

Główna przyczyna: HTML na stronie musi zostać załadowany przed kodem javascript . Rozwiązywanie na 2 sposoby:

1) Zezwól na ładowanie HTML przed kodem 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) Przenieś kod js pod kod HTML

<div id="hello"></div>
<script type ="text/javascript">
    what();
    function what(){
        document.getElementById('hello').innerHTML = 'hi';
    };
</script>
Pines Tran
źródło
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>

user2114253
źródło
problem jest załadowany pięścią HTML div ... niż funkcja skryptu java wywołująca teraz to działa ...
user2114253
1

Miałem ten sam problem i okazuje się, że błąd zerowy wynikał z tego, że nie zapisałem html, z którym pracowałem.

Jeśli element, do którego się odnosi, nie został zapisany po załadowaniu strony, ma wartość „null”, ponieważ dokument nie zawiera go w momencie wczytywania. Używanie window.onload również pomaga w debugowaniu.

Mam nadzieję, że ci się to przydało.

plagueanomicPlague
źródło
1

Ten błąd może się pojawić, nawet jeśli załadujesz skrypt po zakończeniu renderowania HTML. W podanym przykładzie Twój kod

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

nie ma wartości wewnątrz div. Więc błąd jest podnoszony, ponieważ nie ma wartości do zmiany w środku. Powinno być

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

następnie.

Marko Slijepčević
źródło
0

Dodaj jquery do < head>

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

Użyj $ document.ready () : kod może znajdować się w < head>oddzielnym pliku, np. Main.js

1) używając js w tym samym pliku (dodaj to w < head>):

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

2) używając innego pliku, takiego jak main.js (dodaj to w < head>):

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

i dodaj kod w pliku main.js :)

abe312
źródło
0

Musisz zmienić się divw p. Technicznie innerHTML oznacza, że ​​znajduje się wewnątrz<??? id=""></???> części.

Zmiana:

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

w

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

Robić:

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

obróci się

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

co właściwie nie ma sensu.

Możesz także spróbować zmienić:

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

zaangażowany w to

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

żeby to działało.

user6175882
źródło
0

Błąd jest oczywisty, ponieważ nie pobiera tagu HTML, w którym chcesz ustawić dane. Więc udostępnij tag JS, tylko wtedy możesz ustawić Data na to.

Shubham
źródło
0

Bez wątpienia większość odpowiedzi tutaj jest poprawnych, ale możesz też zrobić to:

document.addEventListener('DOMContentLoaded', function what() {
   document.getElementById('hello').innerHTML = 'hi';  
});
Shrey Tripathi
źródło
0

Istnieją różne możliwe przyczyny, o których mówiliśmy, chciałbym po prostu dodać to dla kogoś, kto może mieć ten sam problem co mój.

W moim przypadku brakowało bliskiego div, jak pokazano poniżej

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

Brak bliskiego elementu div może spowodować dezorganizację przekrojów z dziecka na rodzica lub rodzica na dziecko, co spowoduje błąd podczas próby uzyskania dostępu do elementu w DOM

Proxybee
źródło
Odpowiedz zgodnie z przykładem PO.
mishsx
@mishsx powód mojej odpowiedzi: miałem dokładnie ten sam błąd, a kiedy szukałem, widziałem poprawki wszystkich, ale nie było to poprawka w moim własnym przypadku, zadawanie tego samego pytania byłoby powieleniem, czułem, że ktoś inny może być dokładny ta sama sytuacja też i zdecydowałem się opublikować swój własny błąd i naprawić jako odpowiedź ... jak widać, jest to jasno określone w odpowiedzi, dlatego będzie to pomocne dla osób w dokładnie tej samej sytuacji, a jednocześnie jasne dla innych, że tak nie jest nie poprawka błędu w pytaniu. Jeśli to nie jest w porządku, uprzejmie porady, jak powinienem zrobić alternatywny błąd i nie powielając znany dylemat
Proxybee
0

Pozwól załadować DOM. Aby coś zrobić w DOM, musisz go najpierw załadować. W twoim przypadku musisz <div>najpierw załadować tag. wtedy masz coś do zmodyfikowania. jeśli najpierw załadujesz plik js, wtedy ta funkcja będzie wyglądać na twoją, HTMLaby zrobić to, o co prosiłeś, ale kiedy w tym czasie HTMLładujesz i twoja funkcja nie może znaleźć pliku HTML. Możesz więc umieścić skrypt na dole strony. wewnątrz <body>tagu funkcja może uzyskać dostęp do pola <div>Ponieważ DOM jest już załadowany w momencie uruchomienia skryptu.

HeshanHH
źródło