好的。首先,Chrome 报告“真实”foo!=null?
测试。 (其他结果在接下来的三个测试中与 Firefox 相同,在后两个测试中与 IE 相同。)
getElementById() 的规范DOM 级别 3 http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#ID-getElBId says
返回具有给定值的 ID 属性的元素。如果不存在这样的元素,则返回 null。如果多个元素具有具有该值的 ID 属性,则返回的内容是未定义的。
DOM 实现应使用属性 Attr.isId 来确定属性是否属于 ID 类型。
注意:名称为“ID”或“id”的属性不是 ID 类型,除非如此定义。
由于您的文档中没有任何内容可以定义foo
中的元素urn:test
名称空间为 ID 类型,符合 DOM Level 3 的浏览器在这一点上将返回 null。
DOM4 http://www.w3.org/TR/2014/CR-dom-20140508/#dom-nonelementparentnode-getelementbyid,另一方面,说
getElementById(elementId) 方法必须返回上下文对象的后代中按树顺序排列的第一个元素,其 ID 为 elementId,否则如果不存在这样的元素,则返回 null。
身份证上写着 http://www.w3.org/TR/2014/CR-dom-20140508/#concept-id
从历史上看,元素可以有多个标识符,例如通过使用 HTML id 属性和 DTD。该规范使 ID 成为 DOM 的一个概念,并且仅允许每个元素有一个,由 id 属性给出。
and http://www.w3.org/TR/2014/CR-dom-20140508/#concept-named-attribute
A属性是本地名称为A且命名空间和命名空间前缀为空的属性。
所以符合 DOM4 的浏览器在这一点上将返回 foo 元素。
id 属性位于 DOM Level 3 和 DOM4 中的 null 命名空间中,所有浏览器的行为都遵循这一点。
因此,您的元素和属性都已经位于正确的命名空间中,只是 getElementById 不一定适用于自定义命名空间中的元素。
据我所知,元素中的 id 属性不可能urn:test
命名空间可以定义为 ID 类型,这样 getElementById 将匹配 Firefox 或 IE 中的元素。
我建议您使用不同的方式在自定义命名空间中查找具有特定值的 id 属性的元素。
例如,var foo = document.querySelector('[id=foo]');
将匹配所有三个浏览器中的元素。