Javascript 表单元素作为表单的属性
如果表单中有一个表单元素,并且该元素具有Javascript 表单元素作为表单的属性,javascript,dom,Javascript,Dom,如果表单中有一个表单元素,并且该元素具有名称或id,则可以直接从表单的DOM元素中以该名称的属性访问该元素。这种行为似乎得到了非常广泛的支持。它是否包含在任何规范中,如果是,是哪一个规范 DOM2 HTML规范中表单的元素集合的这种行为,但我并没有立即看到将元素作为表单本身的属性转储到任何指定位置的业务,除非短语“它提供对所包含表单控件以及表单元素属性的直接访问”意思是说(如果是这样的话,wow是那么微妙,我把它理解为是指元素集合)。我猜这只是传统行为 为清楚起见:我不是问访问表单字段的最佳方式
名称
或id
,则可以直接从表单的DOM元素中以该名称的属性访问该元素。这种行为似乎得到了非常广泛的支持。它是否包含在任何规范中,如果是,是哪一个规范
DOM2 HTML规范中表单的元素
集合的这种行为,但我并没有立即看到将元素作为表单本身的属性转储到任何指定位置的业务,除非短语“它提供对所包含表单控件以及表单元素属性的直接访问”意思是说(如果是这样的话,wow是那么微妙,我把它理解为是指元素
集合)。我猜这只是传统行为
为清楚起见:我不是问访问表单字段的最佳方式是什么,我是问这种行为是否包含在标准中。(我也在避免将所有内容都转储到窗口对象上;这是另外一个话题。)
示例():
HTML:
我已经检查了IE6、7、8和9、Firefox4.0、Firefox3.6、Chrome12、Opera11和Safari5。他们都这样做了(使表单字段在两个位置都可用)。它在(我的重点)中指定:
表单元素包含类似于集合和元素的行为。它提供了对所包含表单控件以及表单元素属性的直接访问
它的措辞有点模糊,但它涵盖了您看到的行为。发现它:
当表单
元素为索引属性检索编制了索引时,用户代理必须返回元素
集合上的项
方法返回的值,当使用给定索引作为其参数调用时
每个表单
元素都有一个名到元素的映射,称为过去名映射。它用于保存控件的名称,即使它们更改了名称
受支持的属性名称是元素
属性返回的对象当前支持的名称与过去名称映射中当前支持的名称的并集
当表单
元素为命名属性检索编制了索引时,用户代理必须运行以下步骤:
如果name是elements
属性返回的对象支持的属性名称之一,则运行以下子步骤:
当传递name参数时,让candidate成为elements
属性返回的对象上的namedItem()
方法返回的对象
如果候选项是一个元素,则在表单
元素的过去名称映射中添加一个从名称到候选项的映射,用相同名称(如果有)替换前面的条目
返回候选者并中止这些步骤
否则,name是表单
元素的过去名称映射中的一个条目的名称:返回与该映射中的name关联的对象
如果从文档
中删除表单
元素的过去名称映射中列出的元素,则必须从映射中删除其条目
…而且我们从ECMAScript语言映射中了解到,通过[]
进行索引最终是调用项
(对于数字)或名称项
(对于字符串)
多亏了@Carey for,这让我在HTML5草案中看到了facepalm,因为他们试图将HTML DOM内容纳入规范。这也是一份非常旧的文档副本,已被替代。还值得指出的是,相关文档在关于elements属性的部分中隐藏了几段(尽管除了复制它之外,它们实际上与该属性没有任何关系)。谢谢,但我正在从一个标准机构寻找规范。据我所知,Netscape“发明”Javascript,因此链接文档是一种标准。由于AOL关闭了netscape-devedge,因此不再存在用于此目的的官方资源。但是,只要Javascript从未成为“官方标准”,你就找不到官方标准(派生的ECMAScript不包含我们在这里讨论的具体信息)。Netscape确实发明了Javascript,特别是Brendan Eich在那里工作时。但无论谁拥有Netscape,本周都不会为其定义DOM或语言绑定,就标准而言,Netscape和Mozilla现在不得不退居ECMA(用于JavaScript)和W3C(用于DOM和HTML)之后,当然Mozilla的员工是与这两项工作相关的工作组的关键成员。是的,我在问题中也引用了这一点。这对于一个规范来说是非常微妙的,如果它真的要指定这种行为的话。不过,这可能是答案。我想我可以写信给W3C。我很确定这是对最初IE非标准的东西的剩余向后支持behaviour@Gareth:谢谢,我想我记得是Netscape Navigator 2写的,所以这可能不是微软的错,但也许网景是从IE1或其他什么复制过来的——在第一次浏览器大战那令人兴奋的几年里,有很多来回的东西。:-)不管怎么说,这都是错误的。
<form id="theForm">
<input type="text" name="field1" value="foo">
<input type="text" id="field2" value="bar">
</form>
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"