10

I'm looking to (dynamically) obtain a list of HTML elements the browser is currently aware of, such as HTMLPreElement, HTMLSpanElement etc. These objects are global, i.e.

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

So I thought I'd be able to use getOwnPropertyNames like this:

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

to obtain the full list of global properties (MDN states that this returns both enumerable and non-enumerable properties).

Using the above, I get an array with around 70 property nanes. But, it doesn't include objects like HTMLPreElement - only HTMLElement. I also tried:

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

which brings back a bigger list (including addEventListener etc) but again, no HTMLPreElement.

So, where the heck do these HTML{Tag}Element objects reside?

ThinkingStiff
  • 63,812
  • 29
  • 142
  • 238
Graham
  • 6,306
  • 2
  • 34
  • 38

3 Answers3

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

That's what you need?

Chopin
  • 1,432
  • 17
  • 24
5

In Firefox, it seems to be the behavior of elements that their global object is not added unless explicitly requested as a global variable or property. Perhaps Firefox lazy loads them into the environment so that they don't consume memory unless they're actually needed.

It seems that they do not show up when simply requesting the keys of the global object via Object.getOwnPropertyNames unless they've first been explicitly referenced as described above.

http://jsfiddle.net/mBAHm/

  • @gdoron: I was hoping that at some point you were going to add all that info to your answer! ;) Turned out that your answer was right, but Firefox was just making things difficult. :) –  May 01 '12 at 20:54
2
var obj = window;
while(obj){
    for(let prop of Reflect.ownKeys(obj)){
        console.log(prop);
    };
    obj = Object.getPrototypeOf(obj);
};
Michael Price
  • 96
  • 1
  • 7