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)
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 map
s 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
Vous devez vous connecter pour publier un commentaire.
Vous retourner la même valeur à chaque itération. la mise en cache
this
objet ne fait pas référence à votresection
de la collecte des éléments, il se réfère à lawindow
objet. Utilisation$(this)
au lieu de laobj
dans lemap
's de rappel.OriginalL'auteur undefined