Uncaught TypeError:未定義のプロパティ 'top'を読み取れません


91

この質問がすでに回答されている場合は、お詫び申し上げます。解決策を探してみましたが、自分のコードに適したものは見つかりませんでした。私はまだjQueryを初めて使用します。

2つの異なるページに2種類のスティッキーメニューがあります。これが両方のコードです。

$(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();
    });
});

私の問題は、コードの2行目がvar contentNav = $('.content-nav').offset().top;「Uncaught TypeError:Undefined of property 'top' of undefined」というエラーを発生させるため、下部のスティッキーサイドメニューのコードが機能しないことです。実際、その2行目より下にある他のjQueryコードは、その上に配置されない限り、まったく機能しません。

$('.content-nav').offset().top調べた結果、指定されたセレクターが別のページにあるために見つからないことが問題だと思います。もしそうなら、私は解決策を見つけることができません。


1
jsbin.comを使用してください。
Royi Namir 2013

divが存在するかどうかをHTMLでチェックします
Bhadra

回答:


141

オフセットを取得する前に、jQueryオブジェクトに要素が含まれているかどうかを確認します。

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

2
これでうまくいきます!そして、なんと単純な解決策でしょう。まだまだ学ぶべきことがたくさんあります。本当にありがとう。
edubba 2013年

はい、それも私のために働きます。var contentNav = $('.content-nav').offset().topとあなたのコードの違いは何 ですか?
Prashant Tapase 2014年

@Prashant:違いは、コード$('.content-nav')は、最初に見つかった要素の位置を取得する前に、呼び出しで見つかった要素の数がゼロ以外であるかどうかをチェックすることです。
Guffa 2014年

1
stackoverflow.com/questions/28508939/…テーブルはありますが、まだエラーが発生します。
SearchForKnowledge 2015

@グッファありがとうメイト!しかし、ただ不思議に思っています...私は常に<header>タグである要素を配置していました。<div>または<header>の場合は問題でしょうか?
アントニオアルメイダ

17

ドキュメントにclassの要素が含まれていないcontent-navため、メソッド.offset()undefinedを返しますが、実際にはtopプロパティはありません。

あなたはこのフィドルであなた自身のために見ることができます

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

(「未定義」と表示されます)

コード全体のクラッシュを回避するには、代わりに次のようなコードを使用できます。

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

フィドルを更新しました


1
この回答に感謝します。別の問題がありますが、完全に機能しています
Naved Khan

12

これは非常に古いことは知っていますが、ほとんどの初心者はヘッダー要素が読み込まれると関数を呼び出すため、このエラータイプは初心者がよく犯す間違いであることを理解しています。このソリューションはこのスレッドではまったく対処されていないので、追加します。このJavaScript関数は、実際のHTMLがロードされる前に配置された可能性が非常に高いです。ドキュメントの準備ができる前にすぐにJavaScriptを呼び出すと、ドキュメントの要素を必要とする要素が未定義の値を見つける可能性があることに注意してください。


$(document).ready(function(){...}); ドキュメントが読み込まれ、スクリプトがどこにあるかは関係ありません。ただし、ページの上部に記載されているように、このラッパーがないスクリプトは機能しない可能性があります。
デビッド

11

あなたが持っている可能性が高い問題は、存在しないアンカーへのリンクがページのどこかにあるということです。たとえば、次のようなものがあるとします。

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

ページにはそのIDを持つ要素が必要です。例:

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

したがって、各リンクがページ内で対応するアンカーと一致していることを確認してください。


3

私は同様の問題を経験し、フッターのオフセットを取得しようとしていることがわかりましたが、フッターの前にdiv内にスクリプトをロードしていました。それはこのようなものでした:

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

つまり、問題は、フッターが読み込まれる前にフッター要素を呼び出していたことです。

スクリプトをフッターの下プッシュしましたが、うまくいきました


0

私は同じ問題を抱えていました(「Uncaught TypeError:プロパティ 'top' of undefined」を読み込めません)

私は見つけたすべての解決策を試しましたが、助けになりました。しかし、私のDIVに2つのIDがあることがわかりました。

だから、私は2番目のIDを削除し、それが機能しました。

誰かが私のIDを以前に確認するように言っただけです)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.