Ich muss Vanille-JavaScript für ein Projekt verwenden. Ich habe einige Funktionen, von denen eine eine Schaltfläche ist, die ein Menü öffnet. Es funktioniert auf Seiten, auf denen die Ziel-ID vorhanden ist, verursacht jedoch einen Fehler auf Seiten, auf denen die ID nicht vorhanden ist. Auf den Seiten, auf denen die Funktion die ID nicht finden kann, wird der Fehler "Eigenschaft 'addEventListener' von null kann nicht gelesen werden" angezeigt, und keine meiner anderen Funktionen funktioniert.
Unten finden Sie den Code für die Schaltfläche, mit der das Menü geöffnet wird.
function swapper() {
toggleClass(document.getElementById('overlay'), 'open');
}
var el = document.getElementById('overlayBtn');
el.addEventListener('click', swapper, false);
var text = document.getElementById('overlayBtn');
text.onclick = function(){
this.innerHTML = (this.innerHTML === "Menu") ? "Close" : "Menu";
return false;
};
Wie gehe ich damit um? Ich muss diesen Code wahrscheinlich alle in eine andere Funktion einschließen oder eine if / else-Anweisung verwenden, damit nur auf bestimmten Seiten nach der ID gesucht wird, aber nicht genau.
class
in Ihrem HTML statt verwendet habenid
und SiegetElementById
in Ihren Skripten ein fordern .Antworten:
Ich denke, der einfachste Ansatz wäre,
el
vor dem Hinzufügen eines Ereignis-Listeners zu überprüfen, ob er nicht null ist:quelle
null
bevor die Reaktionskomponente montiert wurde!Es scheint, dass
document.getElementById('overlayBtn');
das zurückkehrtnull
da es ausgeführt wird, bevor das DOM vollständig geladen ist.Wenn Sie diese Codezeile unter setzen
dann läuft es ohne probleme.
Beispiel:
quelle
Ich sah mich einer ähnlichen Situation gegenüber. Dies liegt wahrscheinlich daran, dass das Skript ausgeführt wird, bevor die Seite geladen wird. Durch Platzieren des Skripts am Ende der Seite habe ich das Problem umgangen.
quelle
Ich habe den gleichen Fehler erhalten, aber die Durchführung einer Nullprüfung schien nicht zu helfen.
Die Lösung, die ich gefunden habe, bestand darin, meine Funktion in einen Ereignis-Listener zu packen, damit das gesamte Dokument überprüft, wann das DOM vollständig geladen wurde.
Ich denke, das liegt daran, dass ich ein Framework (Angular) verwende, das meine HTML-Klassen und IDs dynamisch ändert.
quelle
Es ist nur so, dass Ihr JS vor dem HTML-Teil geladen wird und dieses Element daher nicht gefunden werden kann. Fügen Sie einfach Ihren gesamten JS-Code in eine Funktion ein, die beim Laden des Fensters aufgerufen wird.
Sie können Ihren Javascript-Code auch unter dem HTML-Code einfügen.
quelle
Das Skript wird vor dem Text geladen. Das Skript bleibt nach dem Inhalt erhalten
quelle
Setzen Sie das Skript am Ende des Body-Tags.
quelle
Vielen Dank an @Rob M. für seine Hilfe. So sah der letzte Codeblock aus:
quelle
Ich habe einfach 'async' zu meinem Skript-Tag hinzugefügt, was das Problem anscheinend behoben hat. Ich bin mir nicht sicher warum, wenn jemand es erklären kann, aber es hat bei mir funktioniert. Ich vermute, dass die Seite nicht auf das Laden des Skripts wartet, also wird die Seite gleichzeitig mit dem JavaScript geladen.
Async / Await ermöglicht es uns, asynchronen Code synchron zu schreiben. Es ist nur syntaktischer Zucker, der Generatoren und Yield-Anweisungen verwendet, um die Ausführung anzuhalten, sodass wir ihn einer Variablen zuweisen können!
Hier ist der Referenzlink: https://medium.com/siliconwat/how-javascript-async-await-works-3cab4b7d21da
quelle
Ich bin auf dasselbe Problem gestoßen und habe nach null gesucht, aber es hat nicht geholfen. Weil das Skript vor dem Laden der Seite geladen wurde. Nur durch Platzieren des Skripts vor dem End-Body-Tag wurde das Problem gelöst.
quelle
Wie andere gesagt haben, besteht das Problem darin, dass das Skript ausgeführt wird, bevor die Seite (und insbesondere das Zielelement) geladen wird.
Aber ich mag die Lösung der Neuordnung des Inhalts nicht.
Die bevorzugte Lösung besteht darin, einen Ereignishandler auf das Ereignis zum Laden der Seite zu setzen und den Listener dort festzulegen. Dadurch wird sichergestellt, dass die Seite und das Zielelement geladen werden, bevor die Zuweisung ausgeführt wird. z.B
quelle
Ich habe eine Sammlung von Zitaten zusammen mit Namen. Ich verwende die Schaltfläche "Aktualisieren", um das letzte mit einem bestimmten Namen verknüpfte Zitat zu aktualisieren. Wenn Sie jedoch auf die Schaltfläche "Aktualisieren" klicken, wird es nicht aktualisiert. Ich füge unten Code für die Datei server.js und die externe Datei js (main.js) ein.
main.js (externes js)
server.js Datei
quelle
Vielen Dank, laden Sie die Skripte auf bestimmte Seiten, die Sie verwenden, nicht für alle Seiten, manchmal mit swiper.js oder einer anderen Bibliothek. Dies kann zu dieser Fehlermeldung führen. Dies ist die einzige Möglichkeit, dieses Problem zu lösen, indem die JS-Bibliothek auf bestimmten Seiten geladen wird Diese ID ist vorhanden und verhindert das Laden derselben Bibliothek auf allen Seiten.
Hoffe das hilft dir.
quelle
Ich hatte das gleiche Problem, aber mein Ausweis war vorhanden. Also habe ich versucht, "window.onload = init;" hinzuzufügen. Dann habe ich meinen ursprünglichen JS-Code mit einer Init-Funktion versehen (nennen Sie es wie Sie wollen). Dies funktionierte, also fügte ich zumindest in meinem Fall einen Ereignis-Listener hinzu, bevor mein Dokument geladen wurde. Dies könnte auch das sein, was Sie erleben.
quelle
Dies liegt daran, dass das Element zum Zeitpunkt der Ausführung des Bundles js noch nicht geladen war.
Ich würde
<script src="sample.js" type="text/javascript"></script>
das ganz unten in derindex.html
Datei verschieben. Auf diese Weise können Sie sicherstellen, dass das Skript ausgeführt wird, nachdem alle HTML-Elemente analysiert und gerendert wurden.quelle
Fügen Sie alle Ereignis-Listener hinzu, wenn ein Fenster geladen wird. Arbeitet wie ein Zauber, egal wo Sie Skript-Tags platzieren.
quelle
load
aus demselben Grund auch nicht mehr empfohlen. DOMContentLoaded ist der bevorzugte Weg, da es erst ausgelöst wird, nachdem das DOM vollständig gezeichnet wurde.