Warum jQuery oder eine DOM-Methoden wie getElementById nicht finden, das element?
Was sind die möglichen Gründe für document.getElementById
, $("#id")
oder andere DOM-Methode /jQuery-selector nicht finden, die Elemente?
Beispiel Probleme sind:
- jQuery leise andernfalls binden eines Ereignishandlers
- jQuery "getter" - Methoden (
.val()
,.html()
,.text()
) Rückkehrundefined
- Einem standard-DOM-Methode, die Rückkehr
null
daraus mehrere Fehler:
Uncaught TypeError: Cannot set property '...' ist null
Uncaught TypeError: Cannot read property '...' ist nulldie häufigsten Formen sind:
Uncaught TypeError: Cannot set property 'onclick' null
Uncaught TypeError: Cannot read property 'addEventListener' null
Uncaught TypeError: Cannot read property 'style' ist null
Viele Fragen, die gefragt werden, warum ein bestimmtes DOM-element wird nicht gefunden, und der Grund ist Häufig, weil der JavaScript-code platziert wird, bevor das DOM-element. Dies ist vorgesehen, um eine kanonische Antwort für diese Art von Fragen. Es ist community-wiki, also bitte fühlen Sie sich frei, es zu verbessern.
InformationsquelleAutor Felix Kling | 2012-12-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurz und einfach:, Weil die Elemente, die Sie suchen, nicht im Dokument vorhanden sind (noch nicht).
Für den Rest der Antwort, die ich verwenden
getElementById
als Beispiel, aber das gleiche gilt fürgetElementsByTagName
,querySelector
und alle anderen die DOM-Methode, wählt Elemente.Mögliche Gründe
Es gibt zwei Gründe, warum ein element nicht vorhanden:
Ein element mit der übergebenen ID wirklich nicht im Dokument vorhanden sind. Sie sollten überprüfen, dass die ID übergeben
getElementById
wirklich passt eine ID eines vorhandenen Elements in der (generierten) HTML-und dass Sie nicht falsch wird die ID (die IDs sind groß-und Kleinschreibung!).Übrigens, in der meisten modernen Browsern, die Umsetzung
querySelector()
undquerySelectorAll()
Methoden, CSS-notation wird verwendet, um ein element durch seineid
zum Beispiel:document.querySelector('#elementID')
im Gegensatz zu der Methode, mit der ein element wird ermittelt, indem seineid
unterdocument.getElementById('elementID')
; in der ersten der#
Charakter ist wichtig, in der zweiten es würde dazu führen, dass das element nicht abgerufen werden.Das element nicht existiert im moment rufen Sie
getElementById
.Letztere Fall ist Recht Häufig. Browser Parsen und verarbeiten der HTML-von oben nach unten. Das bedeutet, dass jeder Aufruf eines DOM-element, das Auftritt, bevor das DOM-element wird in der HTML -, fehl.
Betrachten Sie das folgende Beispiel:
Den
div
erscheint nach diescript
. Im moment wird das Skript ausgeführt, das element nicht existiert noch undgetElementById
zurücknull
.jQuery
Das gleiche gilt für alle Selektoren in jQuery. jQuery wird nicht nach Elementen suchen, wenn Sie falsch Ihre Auswahl oder Sie versuchen, wählen Sie , bevor Sie tatsächlich existieren.
Einen zusätzlichen twist ist, wenn jQuery nicht gefunden, weil Sie geladen haben, das Skript ohne Protokoll-und ausführen aus dem Datei-system:
diese syntax wird verwendet, um das Skript zu laden via HTTPS auf eine Seite mit dem Protokoll https://und laden Sie die HTTP-version auf einer Seite mit Protokoll http://
Er hat die unglückliche Nebenwirkung der Versuch ist und nicht geladen werden kann
file://somecdn.somewhere.com...
Lösungen
Bevor Sie einen Anruf tätigen, um
getElementById
(oder DOM-Methode für diese Angelegenheit) verwenden, stellen Sie sicher, dass die Elemente, auf die Sie zugreifen möchten, existiert, d.h. das DOM geladen ist.Kann dies sichergestellt werden, indem einfach setzen Sie Ihre JavaScript - nach das entsprechende DOM-element
in diesem Fall können Sie auch den code direkt vor dem schließenden body-tag (
</body>
) (alle DOM-Elemente, die verfügbar sein wird an der Zeit das Skript ausgeführt wird).Andere Lösungen hören auf die
Last
[MDN] oderDOMContentLoaded
[MDN] Veranstaltungen. In diesen Fällen spielt es keine Rolle, wo im Dokument Sie den JavaScript-code, Sie müssen nur daran zu erinnern, um alle DOM-Verarbeitung code im Ereignis-Handler.Beispiel:
Finden Sie die Artikel an quirksmode.org für weitere Informationen über event-handling und browser-Unterschiede.
jQuery
Stellen Sie zunächst sicher, dass jQuery geladen wird, richtig. Mithilfe der browser-Entwickler-tools , um herauszufinden, ob die jQuery-Datei gefunden wurde und korrigieren Sie die URL, wenn es nicht (z.B. hinzufügen der
http:
oderhttps:
Schema am Anfang, passen Sie den Pfad, etc.)Hören
load
/DOMContentLoaded
Veranstaltungen ist genau das, was jQuery ist das mit den.ready()
[docs]. Alle Ihre jQuery-code wirkt sich auf das DOM-element sollte drin sein, dass event-handler.In der Tat, die jQuery tutorial ausdrücklich:
Alternativ können Sie auch die Kurzform syntax:
Beide sind gleichwertig.
ready
Ereignis zu reflektieren, das "neuere" bevorzugte syntax, oder ist es besser, es zu verlassen, so dass es funktioniert auf älteren Versionen?Für jQuery, lohnt es sich, auch das hinzufügen in die alternative
$(window).load()
(und ggf. syntaktische alternativen zu den$(document).ready()
,$(function(){})
? Es scheint verwandt, aber Sie fühlt etwas tangential zu dem Punkt, den du machst.Guter Punkt mit
.load
. Bezüglich der alternativen syntax, Sie könnte gesucht werden in der Dokumentation aber da Antworten sollte selbst enthalten ist, es könnte in der Tat sein Wert hinzufügen. Dann wieder, ich bin mir ziemlich sicher, dass dieses bestimmte etwas über jQuery wurde bereits beantwortet und ist wohl bedeckt in anderen Antworten und Links zu es ausreichen könnte.Ich muss revidieren: Offenbar
.load
ist veraltet: api.jquery.com/load-event. Ich weiß nicht, ob es für "nur Bilder" oderwindow
als gut.Keine sorgen 🙂 Auch wenn Sie nicht sicher sind, es ist gut, dass du das erwähnt. Ich werde wahrscheinlich fügen Sie einfach einige einfache code-Schnipsel, zeigen die Verwendung. Vielen Dank für deinen input!
InformationsquelleAutor
Gründe, warum die id-basierte Selektoren, die nicht arbeiten
Lösungen
Versuchen, Zugriff auf das element nach Ihrer Erklärung oder benutzen Sie alternativ Sachen wie
$(document).ready();
Für Elemente aus Ajax-Antworten, verwenden Sie die
.bind()
- Methode von jQuery. Ältere Versionen von jQuery hatte.live()
für die gleichen.Tools verwenden, zum Beispiel [, webdeveloper plugin für Browser] finden Sie doppelte ids und entfernen Sie Sie.
InformationsquelleAutor sumit
Als @FelixKling darauf hingewiesen, das wahrscheinlichste Szenario ist, dass die Knoten, die Sie suchen, nicht vorhanden sind (noch nicht).
Allerdings, modernen Entwicklungsmethoden können oft manipulieren-Dokument Elemente außerhalb des Dokument-Baum entweder mit DocumentFragments oder einfach abnehmen/anbringen aktuelle Elemente direkt. Solche Techniken können verwendet werden, als Teil von JavaScript-templating oder zur Vermeidung einer übermäßigen repaint/reflow-Operationen, während die in Frage kommenden Elemente sind derzeit stark verändert.
Ähnlich, die neue "Shadow-DOM" - Funktionalität ausgerollt über moderne Browser ermöglicht es, Elemente auf dem Teil des Dokuments, aber nicht die Abfrage-ist in der Lage, die document.getElementById und alle seine Geschwister Methoden (querySelector, etc.). Dies geschieht zum Kapseln von Funktionalität und speziell verbergen.
Wieder, obwohl, ist es wahrscheinlich, dass das element, das Sie suchen, ist einfach (noch) nicht in das Dokument, und Sie sollten tun, wie Felix sagt. Allerdings sollte Ihnen auch bewusst sein, dass dies zunehmend nicht der einzige Grund, dass Sie ein element sein könnte, nicht aufzufinden (entweder temporär oder permanent).
InformationsquelleAutor Nathan Bubna
Wenn das element, das Sie zugreifen möchten, ist innerhalb einer
iframe
und Sie versuchen, darauf zuzugreifen, die außerhalb des Kontext desiframe
dies wird auch dazu führen, dass zu scheitern.Wenn Sie möchten, um ein element in einen iframe können Sie herausfinden, wie hier.
InformationsquelleAutor George Mulligan
Wenn das script die Reihenfolge der Ausführung ist nicht das Problem, eine weitere mögliche Ursache für das problem ist, dass das element nicht ausgewählt wird, richtig:
getElementById
erfordert den übergebenen string, der die ID verbatim, und sonst nichts. Wenn Sie das Präfix der übergebene string mit einem#
, und die ID nicht mit einem#
nichts ausgewählt werden:Ebenso für
getElementsByClassName
nicht Präfix der übergebene string mit einem.
:Mit querySelector, querySelectorAll, und jQuery, um mit einem element mit einer bestimmten Klasse name, setzen Sie einen
.
direkt vor der Klasse. In ähnlicher Weise entspricht ein element mit einer bestimmten ID, setzen Sie einen#
direkt vor der ID:Die Regeln hier sind, in den meisten Fällen mit denen identisch, die für CSS-Selektoren, und im detail zu sehen hier.
Groß - /Kleinschreibung und Rechtschreibung nicht egal für alle der oben genannten. Wenn die groß-und Kleinschreibung unterscheidet, oder die Schreibweise anders ist, wird das element nicht ausgewählt werden:
InformationsquelleAutor CertainPerformance
Versuchen Sie
document.getElementById
imsetTimeout()
E. g.
Wenn das funktioniert, dann ist es nur ein timing-problem.
InformationsquelleAutor TakaSoft