Pas getElementById pour le corps?
Cette question m'a dérangé pendant une longue période. Désolé si c'est une question stupide.
Avant, je n'ai connu que vous pouvez obtenir les éléments avec un nom de classe
document.body.getElementsByClassName("foo");
Et j'ai été tellement paresseux, j'ai juste copié et collé le code à l'autre partie pour ce faire
document.body.getElementById("bar");
J'ai accidentellement trouvé, ça ne marchera pas. Je l'ai testé et il dit
TypeError: Object #<HTMLBodyElement> n'a pas de méthode getElementById'
Alors pourquoi a-t-elle getElementsByClassName
etgetElementsByTagName
et tous ceux des méthodes similaires, mais seulement aucune getElementById
?
typeof document === typeof document.body //true
Leurs types sont les mêmes, donc ils devraient avoir la même chose. Mais il ne semble pas être le cas ici.
typeof
est"object"
pour les deux qui signifie qu'ils peuvent être n'importe quel type d'objets. Il ne veut pas vous en dire beaucoup sur les méthodes qu'ils ont.- "Leurs types sont les mêmes, donc ils devraient avoir la même chose." Pas de. Ils sont tous les deux objets, mais pas tous les objets partagent les mêmes propriétés/méthodes.
- Recommandation, ne jamais vérifier les types de javascript pour voir si des choses sont les mêmes, itérer sur les propriétés et de les vérifier. Parce que
typeof document === typeof document.body === typeof null === typeof [] === "object"
Vous devez vous connecter pour publier un commentaire.
Vous pouvez avoir plusieurs éléments avec le même nom de classe afin de circonscrire la recherche à commencer par un nœud spécifique du sens.
Ça n'a pas de sens avec l'id car il doit être unique.
Vous pouvez avoir un seul
id
dans ledocument
, ce pourquoigetElementById
est une méthode dedocument
.Exemple:
De commencer la recherche de classe
a
à partir du nœud<div id="start">
vous donnera un élémentAlors que si vous avez commencez par le haut de nœud de document, il aurait terminé avec deux éléments.
Quant à la
typeof
comparer:typeof
vérifie uniquement pour le type, pas la valeur,document
etdocument.body
sont à la fois des objets, mais des objets différents.Comme vous pouvez le voir,
null
etdocument
partagent le même type, mais ont-ils les mêmes méthodes...? PASId sont uniques pour l'ensemble du document, par conséquent, il n'a pas de sens portée aux enfants les nœuds du document.
Les noms de classe ne sont pas uniques et il y a des cas d'utilisation qui ont du sens pour trouver des éléments qui ont des noms de classe en dessous d'un autre élément.
body.getElementsByClassName('foo')
obtiendrez les éléments qui ont classname 'foo', mais qui sont contenues dans le corps.document.getElementsByClassName('foo')
obtiendrez tous les éléments avec classname " foo " dans l'ensemble du document, y compris le<head>
.typeof document
ettypeof document.body
sont les mêmes, parce qu'ils sont tous les deuxobject
. Les Types ne fonctionnent pas de la façon dont vous pensez qu'ils n'en JS à l'égard des objets. Donc non, ils ne sont pas les mêmes, et il n'y a pas de raison particulière qu'ils auraient à prendre en charge la même fonction. (Même les objets avec le même prototype de ne pas avoir à supporter la même fonction, mais c'est une autre affaire.) Appelez simplementgetElementById
surdocument
et il va fonctionner.("Docteur, docteur, ça fait mal quand je tenir mon bras au dessus de ma tête et tourner rapidement à travers une figure-8 modèle!" "Ouais? Donc, arrête.")
Votre
typeof
exemple n'est pas la comparaison qu'ils sont la même chose, mais qu'ils sont le même "type", pour lequel les deux de retourobject
:De sortie de la console de Firebug:
Plus de détails sur
typeof
peut être trouvé à:https://developer.mozilla.org/en/JavaScript/Reference/Operators/typeof