理解此控制台错误 - 'top'未定义

时间:2015-04-18 13:07:06

标签: javascript jquery menu

所以我一直在使用此功能隐藏/显示我的菜单滚动时使用锚点链接。

它似乎按预期工作,但是我收到了令人讨厌的控制台错误:

未捕获的TypeError:无法读取属性' top'未定义的。

请提出任何建议,我缺少什么?

$(document).ready(function () {
    "use strict";
    var a = !1,
        b = $(".menu-wrapper"),
        c = $(".menu a"),
        d = $(".intro-wrapper");
    b.hide(), $("a[href*=#]:not([href=#])").click(function () {
        var a = $(this.hash);
        return ($(this).addClass("active"), $("html, body").stop().animate({
            scrollTop: a.offset().top
        }, 1e3), !1);
    }),

    $(window).scroll(function () {
        var g = $(this).scrollTop(),
            h = $(this).height(),
            i = d.height();
        g >= i && !a ? (a = !0, b.stop().fadeIn()) : i > g && a && (a = !1, b.stop().fadeOut()), c.each(function () {
            var a = $(this.hash),
                b = a.offset().top,
                c = b + a.outerHeight();
            g + 1 > b && c > g + 1 ? $(this).addClass("active") : $(this).removeClass("active");
        });
    });
});

1 个答案:

答案 0 :(得分:3)

显然,这一行:

var a = $(this.hash);

...可能导致jQuery集中没有任何内容(例如,this.hash不识别页面上的任何元素)。当您在空的jQuery集上调用offset时,它会返回undefined(与大多数其他jQuery“getter”函数一样)。

所以:

  1. 确定您所期望的元素$(this.hash)不存在的原因并解决该问题,或者

  2. offset是一个空的jQuery集时,保护代码不会尝试使用a,例如:

    var a = $(this.hash);
    if (a[0]) {
        $(this).addClass("active");
        $("html, body").stop().animate({
            scrollTop: a.offset().top
        }, 1e3);
    }
    return false;
    

    或者如果你真的想像以前的代码一样缩小/混淆它:

    var a = $(this.hash);
    return (a[0] && ($(this).addClass("active"), $("html, body").stop().animate({
        scrollTop: a.offset().top
    }, 1e3)), !1);