2012-06-23 49 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没有任何孩子,因为它不是一个元素,它是元素的原型。