5

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

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

实际上适用于这些版本。

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

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

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

4

1 回答 1

4

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

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

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

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

于 2012-11-09T01:15:37.440 回答