所以我一直在使用此功能隐藏/显示我的菜单滚动时使用锚点链接。
它似乎按预期工作,但是我收到了令人讨厌的控制台错误:
未捕获的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");
});
});
});
答案 0 :(得分:3)
显然,这一行:
var a = $(this.hash);
...可能导致jQuery集中没有任何内容(例如,this.hash
不识别页面上的任何元素)。当您在空的jQuery集上调用offset
时,它会返回undefined
(与大多数其他jQuery“getter”函数一样)。
所以:
确定您所期望的元素$(this.hash)
不存在的原因并解决该问题,或者
当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);