2012-11-09 46 views
4

我在this SO前面提到的关于在document.getElementById对IE6/7的滑稽行为(和Opera的一些版本)可以找到一个元素,其name属性定义,但不是id属性,使得的document.getElementById()返回一个元素与名称等于id指定

function f() { 
    document.getElementById("a1").value = ...; 
} 
... 
<input name="a1" ...></input> 

实际工作在这些版本。

通过我的克里斯·布鲁姆发现this bug report网,其中一个叫米洛范德Leij用户指出以下(由他this w3c spec简称)搜索:

为自己辩护:“ID和名称属性共享相同的名称空间。“

这是什么意思,ID和名称属性共享相同的名称空间?为什么这个条件足以让IE6/7/Opera在他们的JS引擎中实现这种行为?

回答

3

术语"same namespace"表示名称和ID不完全分离。您可以在一个特定对象上使用相同的nameid,但不能在一个对象上使用name="foo",在另一个对象上不能使用id="foo"。这会产生冲突。

这只是这些浏览器决定实现的方式。对于包含dom元素的id的每个元素也有一个全局变量。这就是他们实施事物的方式。这不是标准的,它不是在更现代的浏览器中完成的事情(除了一些向后兼容性)。

为要检索的任何DOM元素使用id值。在发布的表单中使用name值进行服务器标识。

您的代码将有名称和ID之间没有冲突,如果你不使用某个对象的id和另一个对象相同name,并且有一般不是问题,与给予特定元素相同nameid

+0

如果你必须有一个复制为'name'的'id',你可以在'document.getElementById'处使用一个包装器并仔细检查它是否得到正确的元素。 –

+1

@JeremyJStarcher - 但是'document.getElementById()'只返回一个元素,所以如果它没有返回正确的元素,那么你不能用它来检索你想要的元素,所以如果一个人被迫与一个已知的冲突,你可能不得不以不同方式检索元素。 – jfriend00

+0

那个帮助我很多,非常感谢! – resilva87

相关问题