2012-04-29 32 views
5

我期待(動態)獲得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對象駐留?

+0

看起來這確實在WebKit的工作(只是一個簡單的'對... in'),但Firefox拒絕列出。 – Graham

+1

儘管知道爲什麼你不能在Firefox中看到它很有趣,但知道你爲什麼在乎...有趣而不是有趣? – gdoron

+0

@gdoron - 起初我只需要一個有效標籤列表,但是當我看不到它們時,我更感興趣的是它們爲什麼不出現。 – Graham

回答

3

在Firefox中,它似乎是元素的行爲,除非明確要求作爲全局變量或屬性,否則不會添加其全局對象。也許Firefox懶惰地將它們加載到環境中,以便它們不消耗內存,除非它們真的需要。

看起來,他們不顯示時,通過Object.getOwnPropertyNames簡單地請求全局對象的鍵,除非他們已經首先明確引用如上所述。

http://jsfiddle.net/mBAHm/

+0

現在我可以刪除我的錯誤答案... :) – gdoron

+0

@gdoron:我希望在某些時候你會添加所有信息到你的答案! ;)原來你的回答是對的,但Firefox只是讓事情變得困難。 :) – 2012-05-01 20:54:42

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

這就是你需要的嗎?

+0

這甚至不包括'HTMLElement'對我來說... – Ryan

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