2012-06-23 50 views
0

我最近遇到了確定瀏覽器支持某些DOM功能的問題。其中之一是Element.children功能,這仍然讓我頭痛。我在我的下面這行代碼:Javascript - 確定對Element.children功能的支持

VAR NATIVE_CHILDREN = Element.prototype.hasOwnProperty( '孩子');

它應該檢查瀏覽器是否支持Element.children -FEATURE [https://developer.mozilla.org/en/DOM/Element.children]。根據MDN和快速測試,所有主流瀏覽器均支持此功能。

在Firefox上的Firebug上,NATIVE_CHILDREN的值預計爲true。令人驚訝的是,在Chrome,Safari和Opera上,這個值是錯誤的(不幸的是,我沒有用Windows機器來檢查IE對它的看法)。

根據DOM4 - 免費編輯草案2012年4月5日 [http://dom.spec.whatwg.org/#element],孩子應該是Element對象原型的一部分。顯而易見的Chrome,Safari和Opera的Element對象不包含這種方法!我試過檢查HTMLCollection和Node的原型(我也測試過HTMLParagraphElement和HTMLBodyElement),但它們都沒有包含名爲'children'的方法(除了在Firefox上)。我怎樣才能使我的測試工作跨瀏覽器?我不想爲此使用任何外部庫,因爲這是爲我自己的小圖書館。

+0

非常感謝大家幫助我!我不知道原型的問題。感謝您指出檢查對這個屬性的支持實際上是相當愚蠢的= P – undefined

回答

2

我認爲這個測試可能會在Chrome上返回false的原因是您正在檢查原型。這是不是最好的方式,有以下幾個原因:

  • 不同的瀏覽器可以(做)使用原型的不同實現,一些原型是無法訪問在IE瀏覽器的實例。在這種情況下,我想說你的問題是鉻依賴於(非標準)__proto__財產而不是prototype的結果。我不記得什麼時候,但是我遇到了與chrome類似的問題,如果問題出在這裏,那就是源頭。

  • AFAIK所有的瀏覽器都有其子元素的屬性,雖然它們在某些情況下表現不同,所以我對使用檢查這種屬性的存在有些疑問。

  • 如果你還想檢查這個,爲什麼不使用document.body.hasOwnProperty('children')?在FF,Chrome,Safari和IE上返回true。

1

檢查if('children' in document.body)比查找原型更安全。需要注意的報價,如果不是一個變量children可以使用/創建...

According to QuirksMode,所有的瀏覽器都支持children除了火狐3(這是一個讓我吃驚,因爲當我在瀏覽器中測試工作。 ..),所以應該不需要測試這個屬性。

2

這是因爲某些引擎僅對創建元素時的children屬性拍馬屁。在Chrome控制檯中的快速測試表明:

Element.prototype.hasOwnProperty('children'); //false 
//however, 
document.createElement('foo').hasOwnProperty('children'); //true 
//or even 
!!document.createElement('foo').children; //true 

非功能性往往不會出現在prototype,理由很簡單 - 他們還沒有設置,它不會,如果意義他們會。 Element.prototype沒有任何孩子,因爲它不是一個元素,它是元素的原型。