未捕获的类型错误:无法读取未定义的属性“top”

IT技术 javascript jquery html css dom
2021-02-25 18:48:07

如果这个问题已经得到回答,我深表歉意。我试过寻找解决方案,但找不到任何适合我的代码的解决方案。我还是 jQuery 的新手。

对于两个不同的页面,我有两种不同类型的粘性菜单。这是两者的代码。

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

我的问题是底部粘性侧边菜单的代码不起作用,因为第二行代码var contentNav = $('.content-nav').offset().top;引发了一个错误,内容为“未捕获的类型错误:无法读取未定义的属性‘顶部’”。事实上,第二行下面的其他 jQuery 代码根本无法工作,除非它们被放置在它上面。

经过一番研究,我认为问题是$('.content-nav').offset().top找不到指定的选择器,因为它在不同的页面上。如果是这样,我找不到解决方案。

6个回答

在尝试获取其偏移量之前检查 jQuery 对象是否包含任何元素:

var nav = $('.content-nav');
if (nav.length) {
  var contentNav = nav.offset().top;
  ...continue to set up the menu
}
@Guffa 谢谢伙伴!但是只是想知道......我总是有一个元素,它是一个 <header> 标签。如果它是 <div> 或 <header> 会重要吗?
2021-04-23 18:48:07
@Prashant:不同之处在于,$('.content-nav')在尝试获取找到的第一个元素的位置之前,代码会检查调用找到的元素数量是否为非零。
2021-04-24 18:48:07
是的,它也适用于我。但是var contentNav = $('.content-nav').offset().top和你的代码有什么区别
2021-05-13 18:48:07
这有效!多么简单的解决方案。我还有很多东西要学。谢谢一堆。
2021-05-17 18:48:07
stackoverflow.com/questions/28508939/...我有桌子,但我仍然收到错误。
2021-05-17 18:48:07

您的文档不包含任何具有 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);
}

更新了小提琴

谢谢你的回答我有不同的问题,但它工作得很好
2021-05-12 18:48:07

您最有可能遇到的问题是页面中某处存在指向不存在的锚点的链接。例如,假设您有以下内容:

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

页面中必须有一个具有该 ID 的元素,例如:

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

因此,请确保页面内的每个链接都与其对应的锚点相匹配。

我知道这是非常古老的,但我知道这种错误类型是初学者经常犯的错误,因为大多数初学者会在加载标题元素时调用他们的函数。鉴于此线程中根本没有解决此解决方案,我将添加它。这个 javascript 函数很可能是在加载实际 html 之前放置的请记住,如果您在文档准备好之前立即调用您的 javascript,那么需要来自文档的元素的元素可能会找到未定义的值。

$(document).ready(function () { ... }); 加载文档时触发,脚本驻留在何处无关紧要。但是你说得对,任何没有这个包装器的脚本在页面顶部注明时都可能无法工作。
2021-05-01 18:48:07

我遇到了类似的问题,发现我试图获取页脚的偏移量,但我在页脚之前将脚本加载到 div 中。它是这样的:

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

所以,问题是,我在页脚加载之前调用了页脚元素。

将我的脚本推到页脚下方,它运行良好!