Nicht gefangener TypeError: Die Eigenschaft 'top' von undefined kann nicht gelesen werden


91

Ich entschuldige mich, wenn diese Frage bereits beantwortet wurde. Ich habe versucht, nach Lösungen zu suchen, konnte jedoch keine finden, die zu meinem Code passt. Ich bin noch neu bei jQuery.

Ich habe zwei verschiedene Arten von Sticky-Menüs für zwei verschiedene Seiten. Hier ist der Code für beide.

$(document).ready(function () {
    var contentNav = $('.content-nav').offset().top;
    var stickyNav = function () {
        var scrollTop = $(window).scrollTop();
        if (scrollTop > contentNav) {
            $('.content-nav').addClass('content-nav-sticky');
        } else {;
            $('.content-nav').removeClass('content-nav-sticky')
        }
    };
    stickyNav();
    $(window).scroll(function () {
        stickyNav();
    });
});
$(document).ready(function () {
    var stickyNavTop = $('.nav-map').offset().top;
    // var contentNav = $('.content-nav').offset().top;
    var stickyNav = function () {
        var scrollTop = $(window).scrollTop();
        if (scrollTop > stickyNavTop) {
            $('.nav-map').addClass('sticky');
            // $('.content-nav').addClass('sticky');
        } else {
            $('.nav-map').removeClass('sticky');
            // $('.content-nav').removeClass('sticky')
        }
    };
    stickyNav();
    $(window).scroll(function () {
        stickyNav();
    });
});

Mein Problem ist, dass der Code für das Sticky-Side-Menü unten nicht funktioniert, da in der zweiten Codezeile var contentNav = $('.content-nav').offset().top;ein Fehler mit der Aufschrift "Uncaught TypeError: Eigenschaft 'top' von undefined kann nicht gelesen werden" ausgelöst wird. Tatsächlich funktioniert kein anderer jQuery-Code unterhalb dieser zweiten Zeile, es sei denn, sie werden darüber platziert.

Nach einigen Recherchen besteht das Problem darin, dass $('.content-nav').offset().topder angegebene Selektor nicht gefunden werden kann, da er sich auf einer anderen Seite befindet. Wenn ja, kann ich keine Lösung finden.


1
benutze bitte jsbin.com.
Royi Namir

Überprüfen Sie in HTML, ob der Div vorhanden ist oder nicht
Bhadra

Antworten:


140

Überprüfen Sie, ob das jQuery-Objekt ein Element enthält, bevor Sie versuchen, seinen Offset abzurufen:

var nav = $('.content-nav');
if (nav.length) {
  var contentNav = nav.offset().top;
  ...continue to set up the menu
}

2
Das funktioniert! Und was für eine einfache Lösung. Ich muss noch so viel lernen. Vielen Dank.
Edubba

ja es funktioniert auch bei mir Aber was ist der Unterschied zwischen var contentNav = $('.content-nav').offset().topund Ihrem Code?
Prashant Tapase

@Prashant: Der Unterschied besteht darin, dass der Code prüft, ob die Anzahl der gefundenen Elemente $('.content-nav')ungleich Null war, bevor versucht wird, die Position des ersten gefundenen Elements zu ermitteln.
Guffa

1
stackoverflow.com/questions/28508939/… Ich habe die Tabelle, erhalte aber immer noch den Fehler.
SearchForKnowledge

@ Guffa danke Kumpel! aber ich frage mich nur ... Ich hatte immer das Element an Ort und Stelle, das ein <header> -Tag war. Wäre das wichtig, wenn es sich um einen <div> oder <header> handelt?
Antonio Almeida

17

Ihr Dokument enthält kein Element mit der Klasse content-nav, so dass die Methode .offset()kehrt nicht definiert , was in der Tat keine hat topEigenschaft.

Sie können sich in dieser Geige selbst davon überzeugen

alert($('.content-nav').offset());

(Sie sehen "undefiniert")

Um einen Absturz des gesamten Codes zu vermeiden, können Sie stattdessen folgenden Code verwenden:

var top = ($('.content-nav').offset() || { "top": NaN }).top;
if (isNaN(top)) {
    alert("something is wrong, no top");
} else {
    alert(top);
}

Geige aktualisiert .


1
Vielen Dank für diese Antwort Ich habe ein anderes Problem, aber es funktioniert perfekt
Naved Khan

12

Ich weiß, dass dies extrem alt ist, aber ich verstehe, dass dieser Fehlertyp ein häufiger Fehler für Anfänger ist, da die meisten Anfänger ihre Funktionen beim Laden ihres Header-Elements aufrufen. Da diese Lösung in diesem Thread überhaupt nicht behandelt wird, werde ich sie hinzufügen. Es ist sehr wahrscheinlich, dass diese Javascript-Funktion platziert wurde, bevor das eigentliche HTML geladen wurde . Denken Sie daran, dass Elemente, die ein Element aus dem Dokument benötigen, möglicherweise einen undefinierten Wert finden, wenn Sie Ihr Javascript sofort aufrufen, bevor das Dokument fertig ist.


$ (document) .ready (function () {...}); wird ausgelöst, wenn das Dokument geladen wird und es keine Rolle spielt, wo sich das Skript befindet. Sie haben jedoch so weit recht, dass ein Skript ohne diesen Wrapper möglicherweise nicht funktioniert, wenn es oben auf der Seite angegeben wird.
David

11

Das Problem, das Sie höchstwahrscheinlich haben, ist, dass irgendwo auf der Seite ein Link zu einem Anker vorhanden ist, der nicht vorhanden ist. Angenommen, Sie haben Folgendes:

<a href="#examples">Skip to examples</a>

Auf der Seite muss sich ein Element mit dieser ID befinden, Beispiel:

<div id="examples">Here are the examples</div>

Stellen Sie daher sicher, dass jeder der Links auf der Seite mit dem entsprechenden Anker übereinstimmt.


3

Ich habe ein ähnliches Problem durchlaufen und festgestellt, dass ich versucht habe, den Versatz der Fußzeile zu ermitteln, aber ich habe mein Skript in ein div vor der Fußzeile geladen. Es war ungefähr so:

<div> I have some contents </div>
<script>
  $('footer').offset().top;
</script>
<footer>This is footer</footer>

Das Problem war also, dass ich das Fußzeilenelement aufrief, bevor die Fußzeile geladen wurde.

Ich habe mein Skript unter die Fußzeile gedrückt und es hat gut funktioniert!


0

Ich hatte das gleiche Problem ("Uncaught TypeError: Eigenschaft 'top' von undefined kann nicht gelesen werden")

Ich habe jede Lösung ausprobiert, die ich finden konnte, und festgestellt, dass sie geholfen hat. Aber dann habe ich festgestellt, dass mein DIV zwei IDs hatte.

Also habe ich die zweite ID entfernt und es hat funktioniert.

Ich wünschte nur, jemand hätte mir gesagt, ich solle meine Ausweise früher überprüfen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.