具有相同名称的表单元素反映在DOM中

时间:2011-06-28 09:29:50

标签: javascript dom

如果表单中有多个具有相同name的表单元素,则表单上elements集合中的条目最终会成为这些字段的集合(这很方便)。 DOM2 HTML规范covers the elements collection但当有多个具有相同名称的字段时,似乎不会立即指定此行为。标准是否涵盖了这种行为(DOM2 HTML规范中的其他地方或其他规范中)?

为清楚起见,我不是问最好的方法是访问这些字段。我问他们最终收集在elements集合中的各种集合(不同类型)的事实是否由标准涵盖,如果是的话。

示例(live copy):

HTML:

<form id="theForm">
<input type="text" name="foo" value="one">
<input type="text" name="foo" value="two">
</form>

JavaScript的:

var form = document.getElementById("theForm"),
    foo = form.elements.foo,
    index;
console.log("typeof foo = " + typeof foo);
if (typeof foo !== "undefined") {
  console.log("Object#toString says: " + Object.prototype.toString.call(foo));
}
if ('length' in foo && 'item' in foo) {
  console.log("Looks like a collection of some kind:");
  for (index = 0; index < foo.length; ++index) {
    console.log(index + ": " + foo[index].value);
  }
}

示例输出(适用于Chrome):

typeof foo = object
Object#toString says: [object NodeList]
Looks like a collection of some kind:
0: one
1: two

我已经检查了IE6,7,8和9,Firefox 4.0,Firefox 3.6,Chrome 12,Opera 11和Safari 5.它们都在elements中输入了某种类型的集合(Chrome ,Firefox和Safari使它成为NodeList [虽然奇怪的是在typeof是“功能”而不是“对象”],而IE和Opera使它成为HTMLCollection,但它们都是拥有lengthitem[]访问权限。我只是想找到指定行为的标准(如果有的话)。

2 个答案:

答案 0 :(得分:2)

HTML5规范草案(以及WHAT-WG版本)涵盖了这一点,在这种情况下更像是关于记录它如何始终有效,在HTMLFormControlsCollectionW3C ref,{{ 3}}):

  

如果有多个匹配项,则会返回包含所有这些元素的[HTMLFormControlsCollectionWHAT-WG refW3C ref)对象。

答案 1 :(得分:0)

似乎Firefox 4.0.1和5中的表单访问和DOM访问之间存在差异

http://jsfiddle.net/mplungjan/jMnWP/

form.foo:

typeof formFoo = object
Object#toString says: [object NodeList]
Looks like a collection of some kind:
0: one
1: two

document.getElementsByName( “foo” 的):

typeof docFoo = object
Object#toString says: [object HTMLCollection]
Looks like a collection of some kind:
0: one
1: two