表单元素作为表单的属性

Form elements as properties of the form

本文关键字:表单 属性 元素      更新时间:2023-09-26

如果表单中有一个表单元素,并且该元素具有nameid,则可以将其作为具有该名称的属性直接从表单的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元素被索引以进行命名属性检索时,用户代理必须运行以下步骤:

  1. 如果nameelements属性返回的对象的支持属性名之一,则运行以下子步骤:

    1. 候选者namedItem()方法在传递名称参数时对elements属性返回的对象返回的对象。

    2. 如果候选者是一个元素,则在form元素的过去名称映射中添加从名称候选项的映射,用相同的名称(如果有的话)替换前一个条目。

    3. 返回候选者并中止这些步骤。

  2. 否则,nameform元素的过去名称映射中的一个条目的名称:返回该映射中与name关联的对象。

如果从Document中删除了form元素的过去名称映射中列出的元素,则必须从映射中删除其条目。

从DOM2HTML规范关于ECMAScript语言映射的章节中我们知道,通过[]进行索引最终是对item(用于数字)或namedItem(用于字符串)的调用。

感谢@Carey对我的另一个相关问题的回答,这让我在HTML5草案中大开眼界,因为他们试图将HTML DOM内容纳入规范中。

它在Netscape的Javascript参考中指定

来自DOM 2(我强调):

FORM元素包含类似于集合和元素的行为。它提供了对包含的表单控件以及表单元素属性的直接访问。

它的措辞有点模糊,但它涵盖了你所看到的行为。