表单元素作为表单的属性
Form elements as properties of the form
如果表单中有一个表单元素,并且该元素具有name
或id
,则可以将其作为具有该名称的属性直接从表单的DOM元素中访问。这种行为似乎得到了广泛支持。它有任何规范吗?如果有,是哪一个?
表单的elements
集合的这种行为是在DOM2 HTML规范中指定的,但我不会立即看到将元素作为属性转储到表单本身的任何位置,除非短语"它提供了对所包含表单控件以及表单元素属性的直接访问。"这里的意思是说(如果是这样的话,哇,太微妙了,我读它是指elements
系列)。我猜这只是遗留行为。
为了清楚起见:我不是在问访问表单字段的最佳方式是什么,我是在问这种行为是否包含在标准中。(我还避免了将东西转储到window
对象上的整个过程;这是另一个主题。)
示例(实时副本):
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规范草案中找到:
当为索引属性检索对
form
元素进行索引时,当以给定索引作为参数调用时,用户代理必须返回elements
集合上的item
方法返回的值。每个
form
元素都有一个名称到元素的映射,称为过去名称映射。它用于保持控件的名称,即使它们更改了名称。支持的属性名称是
elements
属性返回的对象当前支持的名称的并集,并且当前在过去名称映射中的名称。当
form
元素被索引以进行命名属性检索时,用户代理必须运行以下步骤:
如果name是
elements
属性返回的对象的支持属性名之一,则运行以下子步骤:
让候选者是
namedItem()
方法在传递名称参数时对elements
属性返回的对象返回的对象。如果候选者是一个元素,则在
form
元素的过去名称映射中添加从名称到候选项的映射,用相同的名称(如果有的话)替换前一个条目。返回候选者并中止这些步骤。
否则,name是
form
元素的过去名称映射中的一个条目的名称:返回该映射中与name关联的对象。如果从
Document
中删除了form
元素的过去名称映射中列出的元素,则必须从映射中删除其条目。
从DOM2HTML规范关于ECMAScript语言映射的章节中我们知道,通过[]
进行索引最终是对item
(用于数字)或namedItem
(用于字符串)的调用。
感谢@Carey对我的另一个相关问题的回答,这让我在HTML5草案中大开眼界,因为他们试图将HTML DOM内容纳入规范中。
它在Netscape的Javascript参考中指定
来自DOM 2(我强调):
FORM元素包含类似于集合和元素的行为。它提供了对包含的表单控件以及表单元素属性的直接访问。
它的措辞有点模糊,但它涵盖了你所看到的行为。
- 表单属性目标是否与asp.net跨页回发相同
- 如何检查浏览器对 HTML5 表单属性的支持
- 如何在 AngularJS 中绑定到表单属性
- 如何从 hhtm 中的表单属性值调用 javascript 函数
- 使用 HTML5 Ajax 表单属性不适用于 ASP.NET MVC,仍被重定向到 Action URL
- MSCRM 识别表单属性集合上的快速视图属性
- JavaScript表单属性null错误
- HTML表单属性“;name”;没有在Firefox中定义
- Symfony获取表单属性
- 在IE中使用新的html5表单属性序列化失败
- 如何收集表单属性名称和“;value"使用javascript从表单的特定部分导入数组
- 调用form.serializable()时必须输入表单属性吗?
- JS -模拟表单提交"表单属性"关于文本输入
- 如何获得表单属性当输入有相同的名称
- Javascript:在IE中尝试使用圆括号而不是方括号访问表单属性
- 访问被字段名覆盖的本机表单属性
- CKEditor:有没有办法从上下文菜单中删除表单属性选项
- Javascript设置表单属性
- 表单属性未定义不是函数
- React收集表单属性并提交