jQuery .offset() renvoie la valeur undefined

J'ai construit cette base .map() fonction avec jQuery pour stocker le haut des décalages de mon code HTML sections dans un tableau (à l'intérieur de balise de script à la fin du corps):

jQuery

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

C'est presque aussi simple que dans le jQuery documentation. Et il a déjà travaillé! ... Jusqu'à ce que, comme il y a une semaine.

Mon code HTML (jade [compilé avec CodeKit]) a une structure très simple:

HTML

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

Étonnamment aujourd'hui, la console a décidé de me dire que ce top n'est pas défini:

Console

Uncaught TypeError: Cannot read property 'top' of undefined

Soi-disant dans ma fonction .map() prend toutes les section balises et retourne le décalage de chaque itéré élément comme indiqué dans la documentation:

Dans la fonction de rappel, cela fait référence à l'actuel de l'élément DOM pour chaque itération.

Même pas de mentionner à nouveau que ce qui a déjà travaillé solide comme le roc pour moi il y a une semaine.

Alors, quel est le problème ici?

Est-il une faute de frappe? Est quelque chose entre les deux déconner? J'ai eu plus de variables qui y sont définies, mais il ne devrait pas faire de différence, devrait-il? Pourrait-il avoir quelque chose à faire avec la compilation de jade? Avec CodeKit? Des indices sont très appréciés!

C'est ma version non censurée, complet JS sur la page (qui a travaillé il y a une semaine):

//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)
Vous retourner la même valeur à chaque itération. la mise en cache this objet ne fait pas référence à votre section éléments, il se réfère à la window objet. Utilisation $(this) au lieu de la obj dans le maps de rappel.
Cela a résolu la console d'erreur, merci beaucoup, très clair pourquoi. À ma grande surprise, mon " loi " de la fonction semble rompu tho...Toutes les idées ou devrais-je plutôt ouvrir un nouveau sujet?
Vous êtes les bienvenus. Que votre question porte sur le map méthode, il ne représente pas le problème actuel. Je suggère de poster une autre question.
Vous ne voudriez pas faire une réponse btw, si je peux marquer ce que résolu?
alors... votre titre n'est pas décrit en fait le vrai problème. cela n'a rien à faire avec la carte, c'est la méthode de la compensation. certes causé par la manière dont vous utilisez la carte, mais la carte n'est certainement pas le retour indéfini.

OriginalL'auteur Marian | 2014-08-19