Document.getElementById()返回名称等于id指定的元素

res*_*a87 5 html javascript internet-explorer dom quirks-mode

我之前在这个SO中提到过有关IE6/7(以及某些版本的Opera)的有趣行为,document.getElementById可以找到一个name属性已定义但不id属性的元素,这样

function f() {
    document.getElementById("a1").value = ...;
}
...
<input name="a1" ...></input>
Run Code Online (Sandbox Code Playgroud)

实际上适用于这些版本.

通过网络搜索我发现了Chris Bloom的这个错误报告,其中名为Milo van der Leij的用户指出了以下内容(正如他在此w3c规范中所提到的):

在他们的辩护中:"id和name属性共享相同的名称空间."

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

jfr*_*d00 4

该术语的"same namespace"意思是名称和 ID 并不是完全分开的。您可以在一个特定对象上使用相同的nameand id,但不能name="foo"在一个对象和id="foo"另一对象上使用。这就产生了冲突。

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

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

id如果您不在一个对象上使用 an 且在另一个对象上使用相同的,则您的代码在名称和 id 之间不会发生冲突,并且为特定元素提供相同的和name通常不会出现问题。nameid