将元素表单作为表单的属性

时间:2011-06-28 08:37:06

标签: javascript dom

如果表单中有表单元素且该元素具有nameid,则可以直接从表单的DOM元素作为具有该名称的属性访问它。此行为似乎得到了非常广泛的支持。它是否涵盖在任何规范中,如果是,那么哪一个?

DOM2 HTML规范中表单的elements集合is specified的此行为,但我没有立即看到将表单作为属性转储到表单本身指定的任何位置的业务,除非短语“它提供了对包含的表单控件的直接访问以及表单元素的属性。” here意味着(如果是这样,哇是那么微妙,我读了它引用elements集合。我猜它只是遗留行为。

为了清楚起见:我不是在询问访问表单字段的最佳方式是什么,我在问这个行为是否被标准所涵盖。 (我也避免了在window对象上抛弃事物的整个业务;这是另一个主题。)

示例(live copy):

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.他们都这样做了(在两个地方都可以使用表单字段)。

3 个答案:

答案 0 :(得分:1)

找到它in the draft HTML5 specification

  

当<{1}}元素为索引属性检索索引时,用户代理必须返回form集合上item方法返回的值,以给定索引作为参数调用时。

     

每个elements元素都有一个名称映射到称为过去的名称映射的元素。它用于保存控件的名称,即使它们更改了名称。

     

支持的属性名称是form属性返回的对象当前支持的名称的联合,以及过去名称映射中当前的名称。

     

当<{1}}元素为索引以进行命名属性检索时,用户代理必须执行以下步骤:

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

         
        
    1. candidate 成为form方法在传递名称时由elements属性返回的对象返回的对象参数。

    2.   
    3. 如果 candidate 是一个元素,则在namedItem()元素的过去添加 name 候选的映射名称映射,用相同的名称替换上一个条目,如果有的话。

    4.   
    5. 返回候选人并中止这些步骤。

    6.   
  2.   
  3. 否则, name elements元素的过去名称映射中的一个条目的名称:返回与 name 关联的对象那张地图。

  4.         

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

...我们从ECMAScript语言映射的DOM2 HTML specification's section知道,通过form建立索引最终会调用Document(对于数字)或[] (对于字符串)。

感谢@Carey his answer to my other related question,这让我看到了facepalm并查看HTML5草案,因为他们试图将HTML DOM内容包含在规范中。

答案 1 :(得分:0)

答案 2 :(得分:0)

来自DOM 2(我的重点):

  

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

措辞有点费力,但这涵盖了你所看到的行为。