2009-09-09 8 views
1

Ceci est la galerie m'a demandé de mettre en œuvrequestion frustrantes avec getElementById() de JavaScript

http://sandbox.leigeber.com/slideshow/

J'ai haché et changé imperceptiblement il avait insérer dans le templating du nouveau site système un peu plus facile.

Chaque fois que je le lance, cette ligne provoque une erreur

ta=document.getElementById(thumbid); 

Dire que ta est nulle. Je sais que la valeur de la variable var existe en tant qu'ID de la liste non ordonnée.

J'ai essayé de comprendre ce qui se passe depuis au moins une demi-heure maintenant, et je n'arrive pas à le clouer! Est-ce que quelqu'un peut me dire ce que je fais mal?

+0

l'erreur que j'obtiens est 't = ta.getElementsByTagName ('li');' – nickf

Répondre

2

Ouais le code semble bien, et l'exécution des mêmes lignes de la console Firebug fonctionne bien, donc je me demande si l'élément thumbs existe réellement au moment de l'exécution? Est-ce dans un gestionnaire document.ready? Si elle est appelée avant que l'élément existe sur cette page, alors ta sera null, ce qui créerait cette erreur.

0

Il est un peu difficile de quelle valeur thumbid devrait avoir, mais il me semble que votre problème est que les éléments li dans votre liste à puces ne sont pas id s, ils ont value s. L'appel document.getElementById('thumbs') fonctionne très bien pour obtenir l'élément ul de la liste elle-même.

0

Dans Safari 4 ligne 19 me jetait une erreur de type concernant ta qui était null.
Cela est dû à la ligne que vous avez indiquée où ta a été affectée. J'aime comment vous encapsuler les fonctions dans une fermeture, mais je pense que le window.onload peut être changé pour être plus jQuery like; la même chose peut être dit de réellement selecting the elements que vous cherchez, quelque chose comme t=$('ul#thumbs li') devrait faire l'affaire. Je ne sais pas si lancer var devant ta va tout réparer, mais ça vaut le coup.

+0

Si j'utilise un sélecteur jQuery, les méthodes JS natives fonctionneront-elles sur l'objet jQuery retourné? Je ne le crois pas ... – alex

2

Il semble que la fonction diaporama soit appelée trop tôt pour l'initialisation. Cela sera appelé avant que l'arborescence DOM soit prête:

var slideshow = function() { 
... 
}(); 

Essayez de supprimer that() à la fin.

+0

Je pense que c'est correct. La solution la plus simple consiste peut-être simplement à déplacer les références de script en bas de la page et à les laisser telles quelles. Cela devrait également améliorer le temps de chargement initial de la page. –

+0

Ah j'ai raté la parenthèse de la fonction auto-exécutable! – alex

+0

+1 pour une réponse utile – alex

2

Bonne nouvelle! jQuery est écrit en Javascript vanilla! Vous devriez être capable de copier leur méthode pour obtenir des éléments par ID et l'utiliser.