2012-06-27 23 views
6

Esta pregunta me ha molestado durante mucho tiempo. Lo siento si es una pregunta estúpida.No getElementById para el cuerpo?

Antes, he sabido que se puede obtener los elementos con un nombre de clase

document.body.getElementsByClassName("foo"); 

y yo estaba tan flojo, por lo que sólo copiar y pegar el código de la otra parte para hacer esto

document.body.getElementById("bar"); 

Accidentalmente encontré que no funcionará. Probé y dice

TypeError: Object #<HTMLBodyElement> has no method 'getElementById'

Entonces, ¿por qué tiene getElementsByClassName y getElementsByTagName y todos esos métodos similares, pero sólo hay getElementById?

typeof document === typeof document.body //true 

Sus tipos son los mismos, por lo que deberían tener la misma función. Pero no parece ser el caso aquí.

+3

'typeof' es' "object" 'para ambos, lo que significa que pueden ser * cualquier * tipo de objeto. No dice mucho sobre los métodos que tienen. – pimvdb

+2

"Sus tipos son los mismos, por lo que deberían tener la misma cosa". No. Ambos son objetos, pero no todos los objetos comparten las mismas propiedades/métodos. – Artefact2

+2

Recomendación, nunca revise los tipos en javascript para ver si las cosas son iguales, repita las propiedades y compruébelas. Porque 'typeof document === typeof document.body === typeof null === typeof [] ===" object "' – NicoSantangelo

Respuesta

5

Puede tener múltiples elementos con el mismo nombre de clase, por lo que tiene sentido restringir la búsqueda para comenzar con un nodo específico.

No tiene sentido con id porque debe ser único.

Usted puede tener sólo una id en el document, esto porqué getElementById es un método de document.

Ejemplo:

<body> 
    <div id="start"> 
     <span class="a"> 
    </div> 
    <div class="a"> 
    </div> 
</body> 

en Iniciar búsqueda para la clase a desde el nodo <div id="start"> le dará un elemento,
Mientras que si usted tendría inicio del documento node- superior, habría terminado con dos elementos .

En cuanto a la typeof comparando:

typeof 1 == typeof 2 == "Number" // true 
1 !== 2 // true. 

typeof sólo comprueba el tipo, no el valor, document y document.body son ambos objetos, pero de diferentes objetos.

typeof document === typeof document.body === typeof null === "object" // true 
document === document.body // false!!! 

Como se puede ver, null y document compartir el mismo tipo, pero ¿tienen los mismos métodos ...? NO

+1

@Drek, gracias por la corrección de errores. – gdoron

4

Los Id. Son exclusivos de todo el documento, por lo tanto, no tiene sentido ubicarlos en los nodos secundarios del documento.

Los nombres de clase no son únicos y hay casos de uso que tienen sentido para encontrar elementos que tienen nombres de clase debajo de otro elemento.

body.getElementsByClassName('foo') obtendrá los elementos que tienen el nombre de clase 'foo' pero están contenidos en el cuerpo.

document.getElementsByClassName('foo') obtendrá todos los elementos con el nombre de clase 'foo' en todo el documento, incluido el <head>.

1

typeof document y typeof document.body son lo mismo porque ambos son object. Los tipos no funcionan de la manera que crees que lo hacen en JS con respecto a los objetos. Entonces, no, no son lo mismo, y no hay una razón en particular por la que tengan que soportar el mismo conjunto de funciones. (Incluso los objetos con el mismo prototipo no tienen que admitir el mismo conjunto de funciones, pero esa es otra cuestión). Simplemente llame al getElementById en document y funcionará.

("Doctor, doctor, me duele cuando tengo mi brazo sobre la cabeza y girarla rápidamente a través de un patrón en forma de 8!" "¿Sí? Así que ya basta.")

Cuestiones relacionadas