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>
javascript
onload
innerhtml
Joshua W.
źródło
źródło
Najpierw spróbujmy zrozumieć pierwotną przyczynę, dlaczego tak się dzieje.
Przeglądarka zawsze ładuje cały HTML DOM od góry do dołu. Każdy kod JavaScript zapisany w
script
tagach (obecny whead
sekcji 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 whead
tagu próbują uzyskać dostęp do elementu posiadającego id,hello
nawet 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.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
hello
element id jest dostępny / dostępny. Można to osiągnąć na dwa sposoby:hello
załadowaniu DOM zawierającego element id. Możesz to osiągnąć, po prostu przesuwając tag script za wszystkimi elementami DOM, tj. Na dole, gdziebody
koń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>
window.onload
przechwytywanie 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 ohello
identyfikatorze 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ątrzhead
tagu.<!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>
źródło
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>
źródło
Po prostu włóż swój JS
window.onload
window.onload = function() { what(); function what() { document.getElementById('hello').innerHTML = 'hi'; }; }
źródło
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>
źródło
Javascript wygląda dobrze. Spróbuj uruchomić go po załadowaniu elementu div. Spróbuj uruchomić tylko wtedy, gdy dokument jest gotowy.
$(document).ready
w jQuery.źródło
window.onload
może wystarczyć, ale dostępne są również inne wydarzenia.window
<!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>
źródło
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
Możesz spróbować użyć metody setTimeout, aby upewnić się, że kod HTML zostanie załadowany jako pierwszy.
źródło
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>
źródło
<!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
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.
źródło
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.
źródło
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.js1) 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 :)
źródło
Musisz zmienić się
div
wp
. 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.
źródło
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.
źródło
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'; });
źródło
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
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
źródło
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ą,HTML
aby zrobić to, o co prosiłeś, ale kiedy w tym czasieHTML
ładujesz i twoja funkcja nie może znaleźć plikuHTML
. 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.źródło