如果表单中有一个表单元素,并且该元素有一个name
or id
,您可以直接从表单的 DOM 元素访问它作为具有该名称的属性。这种行为似乎得到了非常广泛的支持。是否有任何规范涵盖它?如果有,是哪一个规范?
此行为适用于表单elements
收藏已指定 http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-76728479在 DOM2 HTML 规范中,但我并没有立即看到将元素转储为表单本身在任何地方指定的属性的业务,除非短语“它提供对所包含的表单控件以及表单元素的属性的直接访问。” here http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-40002357意思是说(如果是这样,哇,太微妙了,我把它读作指的是elements
收藏)。我猜这只是遗留行为。
为了清楚起见:我不是问访问表单字段的最佳方式是什么,而是问标准是否涵盖这种行为。 (我也避免了将东西倾倒在window
目的;那是另一个话题了。)
例子 (实时复制 http://jsbin.com/amahol):
HTML:
<form id="theForm">
<input type="text" name="field1" value="foo">
<input type="text" id="field2" value="bar">
</form>
JavaScript:
var f = document.getElementById("theForm");
console.log(f.elements.field1.value); // "foo", per spec
console.log(f.field1.value); // also "foo"
console.log(f.elements.field2.value); // "bar", per spec
console.log(f.field2.value); // also "bar"
我检查了 IE6、7、8 和 9、Firefox 4.0、Firefox 3.6、Chrome 12、Opera 11 和 Safari 5。它们都这样做(使表单字段在两个地方都可用)。
找到了在 HTML5 规范草案中 http://www.w3.org/TR/html5/forms.html#htmlformelement:
When a form
元素是为索引属性检索建立索引,用户代理必须返回由item
方法上的elements
集合,当使用给定索引作为参数调用时。
Each form
元素具有名称到元素的映射,称为过去的名字地图。它用于保留控件的名称,即使它们更改名称也是如此。
支持的属性名称是返回的对象当前支持的名称的并集elements
属性,以及当前在过去名称映射中的名称。
When a form
元素是为命名属性检索建立索引,用户代理必须运行以下步骤:
-
If name是返回的对象支持的属性名称之一elements
属性,然后运行以下子步骤:
-
Let 候选人是返回的对象namedItem()
方法返回的对象elements
属性当传递name争论。
-
If 候选人是一个元素,然后添加一个映射name to 候选人 in the form
元素过去的名称映射,用相同的名称替换先前的条目(如果有)。
-
Return 候选人并中止这些步骤。
-
否则,name是其中一项的名称form
元素过去的名称映射:返回与之关联的对象name在那张地图里。
如果一个元素列在form
元素过去的名称映射已从Document
,那么它的条目必须从映射中删除。
...我们从DOM2 HTML 规范部分 http://www.w3.org/TR/DOM-Level-2-HTML/ecma-script-binding.html在 ECMAScript 语言映射上,索引通过[]
最终成为对任一者的调用item
(对于数字)或namedItem
(对于字符串)。
感谢@Carey他对我其他相关问题的回答 https://stackoverflow.com/questions/6504372/form-elements-with-the-same-name-reflected-in-the-dom/6504598#6504598,这让我捂着脸查看了 HTML5 草案,因为他们试图将 HTML DOM 内容纳入规范中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)