我希望(动态)获取浏览器当前知道的HTML元素列表,例如HTMLPreElement
,HTMLSpanElement
等。这些对象是全局的,即
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
对象驻留在哪里?
答案 0 :(得分:5)
for (var prop in window)
console.log(prop);
这就是你需要的东西?
答案 1 :(得分:4)
在Firefox中,除非明确请求作为全局变量或属性,否则它们的全局对象似乎是元素的行为。也许Firefox懒惰地将它们加载到环境中,这样它们就不会消耗内存,除非实际需要它们。
当简单地通过Object.getOwnPropertyNames
请求全局对象的键时,它们似乎不显示,除非它们首先被如上所述显式引用。
答案 2 :(得分:1)
var obj = window;
while(obj){
for(let prop of Reflect.ownKeys(obj)){
console.log(prop);
};
obj = Object.getPrototypeOf(obj);
};