2012-04-29 31 views
5

Busco a (dinámicamente) obtener una lista de los elementos HTML que el navegador está actualmente en cuenta, tales como HTMLPreElement, HTMLSpanElement etc. Estos objetos son globales, es decir,¿Listar todas las propiedades del objeto ventana?

console.log('HTMLPreElement' in window); //=> true 

así que pensé que sería capaz de utilizar getOwnPropertyNames así:

console.log(Object.getOwnPropertyNames(window)); 

para obtener la lista completa de propiedades globales (MDN afirma que esto devuelve las propiedades enumerables y no enumerables).

Usando lo anterior, obtengo una matriz con alrededor de 70 nanes de propiedad. Pero, no incluye objetos como HTMLPreElement - solo HTMLElement. También probé:

console.log(Object.getOwnPropertyNames(window.Window.prototype)); 

nuevo que trae una lista más grande (incluyendo addEventListener etc) pero de nuevo, no HTMLPreElement.

Entonces, ¿dónde diablos residen estos objetos HTML{Tag}Element?

+0

Parece que esto hace el trabajo en WebKit (con sólo un simple 'para ... in'), pero Firefox se niega a enumerarlos. – Graham

+1

Aunque es interesante saber por qué no puedes verlo en Firefox, es interesante no menos saber por qué te importa ...? – gdoron

+0

@gdoron - al principio solo necesitaba una lista de etiquetas válidas, pero cuando no podía verlas, estaba más interesado en por qué no aparecían. – Graham

Respuesta

3

En Firefox, el comportamiento de los elementos parece ser que su objeto global no se agrega a menos que se solicite explícitamente como una variable o propiedad global. Quizás Firefox perezosa los carga en el entorno para que no consuman memoria a menos que realmente los necesiten.

Parece que no aparecen cuando simplemente solicitando las llaves del objeto global a través de Object.getOwnPropertyNames a menos que primero han sido referenciados explícitamente como se describió anteriormente.

http://jsfiddle.net/mBAHm/

+0

Ahora puedo eliminar mi respuesta incorrecta ... :) – gdoron

+0

@gdoron: Tenía la esperanza de que en algún momento ibas a agregar toda esa información a tu respuesta ! ;) Resultó que tu respuesta era correcta, pero Firefox solo estaba dificultando las cosas. :) –

4
for (var prop in window) 
    console.log(prop); 

Eso es lo que necesita?

+0

Eso ni siquiera incluye 'HTMLElement' para mí ... – Ryan

1
var obj = window; 
while(obj){ 
    for(let prop of Reflect.ownKeys(obj)){ 
     console.log(prop); 
    }; 
    obj = Object.getPrototypeOf(obj); 
}; 
Cuestiones relacionadas