Warum erhalte ich die Meldung "Uncaught TypeError: Cannot read property" Fehler mit dieser variable?
In dieses jsFiddle ich habe zwei Variablen, die würden entweder undefined oder null. Das script funktioniert, wenn die erste variable ist initialisiert, aber nicht, wenn die zweite verwendet wird. Sie können dies testen, indem auskommentieren und das script ausgeführt.
Dies ist der code:
var test = $('.not-here').height(); //works with this variable
var test2 = $('.also-not-here').offset().top; //doesn't work with this
$('#output').append('yeah');
Warum habe ich dieses problem und wie bekomme ich es?
- Sie können nicht de-Referenz etwas, das nicht definiert ist. Das ist alles dort ist zu ihm. Wenn ein jQuery Selektor gibt keine Elemente, jQuery, dennoch gibt eine leere Menge (also etwas, das IST definiert). Wenn Sie anrufen .offset() auf eine leere Menge, so ist undefiniert. Also... Man kann nicht eine Methode aufzurufen, die auf die return-Wert (offset) in diesem Fall.
- Uncaught TypeError: Cannot read property 'top' von null
- Das Problem ist, dass
$('.also-not-here')
ist eigentlich eine (leere) Liste, in der Erwägung, dass$('.also-not-here').offset()
ist wirklichundefined
. - Oder um es anders auszudrücken, jQuery schützt Sie von undefined und null, aber sobald man sich von seinem Schutz, Sie müssen mit sich selbst.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sowohl Ihre Selektoren ungültig sind, als solche sind Sie wieder eine leere jQuery-Ergebnis-Liste.
Aufrufen
.height()
auf eine leere Ergebnis-Liste zurücknull
.Aufruf
.offset()
auf eine leere Ergebnis-Liste gibt auchnull
.Der Grund, warum Sie bekommen
Uncaught TypeError: Cannot read property 'top' of null
in der zweiten Zeile ist, weil Sie versuchen, rufen Sie.top()
auf das Ergebnisoffset()
dienull
.Grundsätzlich Sie versuchen zu führen
null.top()
.Ich weiß nicht, was Ihr code ist, sondern als reines Beispiel, könnten Sie die Resultate überprüfen, die erste vor der Verwendung, ähnlich zu diesem:
$('.also-not-here').offset()
zurücknull
wenn der Knoten nicht existiert. Das ist, wie es funktioniert by design.Als Sie wollen einen fix, damit der code nicht zu brechen, können Sie etwas wie das hier tun:
Diese zurück
null
, da es kein element$('.not-here')
.Wieder,
Diese auch zurück
null
, da es kein element$('.also-not-here')
und wir können nicht Lesen-Eigenschafttop
null.Ich würde vorschlagen, dies zu tun:
Den ersten
test
ist immer auf null gesetzt. Der zweite Fall, Sie versuchen, Referenz ist eine Eigenschaft der Wert null wird eine exception zu werfen.