jQuery .offset()返回未定义的值

时间:2014-08-19 17:14:45

标签: jquery undefined pug offset codekit

我用jQuery构建了这个非常基本的.map()函数,用于将我的HTML部分的顶部偏移量存储在数组中(在主体末尾的脚本标记内)

的jQuery

$(window).load(function() {
    var obj = $(this),
        sec = $('section'),
        arr = sec.map(function() {
                  return obj.offset().top
              }).get();
})

这几乎和jQuery documentation一样简单。它已经奏效了! ......直到一个星期前 我的HTML(jade [使用CodeKit编译])具有非常简单的结构:

HTML

body.preload
    section#id1
        whateverContent
    section#id2
        moreContent
    section#id3
        evenMoreContent
    ...

令人惊讶的是,今天控制台决定告诉我顶部未定义:

控制台

Uncaught TypeError: Cannot read property 'top' of undefined

据说在我的函数中.map()采用所有部分标记,返回每个迭代元素的偏移量,正如文档中所述:
在回调函数中,这指的是每次迭代的当前DOM元素。
甚至还没有提到,大约一个星期前,这已经对我有用了。

那么这里的问题是什么?

有拼写错误吗?在两者之间乱七八糟的东西?我在那里定义了更多变量,但它应该没有任何区别,是吗?它可以用编译玉来做点什么吗?使用CodeKit?任何线索都非常感谢!

这是我在页面上未经审查的完整JS(一周前工作过):

// Let DOM finish loading
$(window).load(function() {
    // CSS animation hack
    $('body').removeClass('preload')
    // Sticky nav and active class
    var win = $(window),
        doc = $(document),
        obj = $(this),
        sec = $('section'),
        nav = $('nav'),
        anc = $('nav a'),
        pos = nav.offset().top,
        // Fill array with top offsets from sections
        arr = sec.map(function() {
                    return obj.offset().top
              }).get(),
        act = function() {
                    win.scrollTop() > pos ? nav.addClass('sticky')
                    : nav.removeClass('sticky'),
                    $.each(arr, function(i, val) {
                            (win.scrollTop() > val && win.scrollTop() < (val + sec.eq(i).outerHeight(true) + 1) ) ? anc.eq(i).addClass('active')
                            : anc.eq(i).removeClass('active')
                    })
                };
    // Execute sticky function
    win.scroll(act)

1 个答案:

答案 0 :(得分:1)

您在每次迭代中返回相同的值。缓存的this对象没有引用您的section集合的元素,它指的是window对象。在$(this)的回调中使用obj代替map