列出window对象的所有属性?

11
我想要(动态地)获取浏览器当前已知的 HTML 元素列表,例如 HTMLPreElementHTMLSpanElement 等。这些对象是全局的,即...
console.log('HTMLPreElement' in window);  //=> true

于是我以为我可以这样使用getOwnPropertyNames

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

要获取全局属性的完整列表(MDN表示这将返回可枚举和不可枚举属性),可以使用以上方法。使用上述方法,我得到了一个大约有70个属性名的数组。但是它并不包括像HTMLPreElement这样的对象 - 只有 HTMLElement。我还尝试过:

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

这将返回一个更大的列表(包括addEventListener等),但是再次没有HTMLPreElement

那么,这些HTML{Tag}Element对象到底在哪里?


看起来这在WebKit中可以工作(只需简单的for...in),但Firefox拒绝列出它们。 - Graham
1
虽然了解为什么在 Firefox 中看不到它很有趣,但知道你为什么关心同样有趣...? - gdoron
起初,@gdoron只需要一个有效标签列表,但是由于他未能看到它们,因此更加关注的是它们为什么不会出现。 - Graham
3个回答

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

这是你需要的吗?

6
在Firefox中,元素的全局对象似乎只有在显式请求为全局变量或属性时才会添加。也许Firefox将它们延迟加载到环境中,以便除非实际需要,否则它们不会消耗内存。
似乎仅通过Object.getOwnPropertyNames简单请求全局对象的键时,它们不会出现,除非首先像上面描述的那样明确引用它们。

http://jsfiddle.net/mBAHm/


@gdoron:我一直希望你能在你的回答中添加所有这些信息!;) 结果证明你的答案是正确的,但是Firefox只是让事情变得困难。 :) - user1106925

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接