【问题标题】:Is it OK to have multiple HTML forms with the same name?可以有多个同名的 HTML 表单吗?
【发布时间】:2012-06-20 01:25:53
【问题描述】:

我想这样做是有正当理由的,但这是一个很长的故事,所以我会忘记解释原因,只是问是否可以这样做。

我有一个页面需要多个具有相同名称的表单,但我只想提交其提交按钮为单击的表单。例如,我的页面上可能有以下内容:

<form name="input" action="" method="get">
Username: <input type="text" name="user" />
<input type="submit" value="Submit" />
</form>

text

<form name="input" action="" method="get">
Username: <input type="text" name="user" />
<input type="submit" value="Submit" />
</form>

text

<form name="input" action="" method="get">
Username: <input type="text" name="user" />
<input type="submit" value="Submit" />
</form>

这可以接受吗?

【问题讨论】:

标签: html forms


【解决方案1】:

关于 HTML 4.01 规范,您可以使用具有相同 name 属性的 form 元素,因为它们没有唯一性要求。但是,这样做违背了这些属性的目的。它们旨在使在客户端脚本中引用表单变得更容易:如果您有 &lt;form name=foo&gt;,则 document.foo 引用该表单。

当使用相同的name 属性时会发生什么是未定义的,但浏览器似乎做的是返回一个数组。在您的示例中,document.foo 将是一个 3 元素数组,document.foo[0] 是第一种形式。但这没什么用,因为(假设文档中没有其他形式)您可以使用document.forms[0],具有明确的含义。

name 属性本身对于 form 元素来说已经过时了(但对于表单字段来说却不是,它一直是必不可少的)。 HTML 4.01 spec clause on form 说:

name = cdata [CI] 此属性命名元素,以便可以从样式表或脚本中引用它。笔记。包含此属性是为了向后兼容。应用程序应该使用id 属性来识别元素。”

在 HTML5 草案中,即使是正式规则也不允许使用相同的 name 属性。 HTML5 clause on the name attribute on form 表示它的值“在它所在的forms 集合中的form 元素中必须是唯一的,如果有的话”。这是一个令人困惑的表述,但最安全的做法是假设它在文档的 form 元素中必须是唯一的。

【讨论】:

  • 关于 document.foo 的多个匹配名称情况未定义的位,这不是从dev.w3.org/html5/spec/dom.html#dom-document-namedItem-which 到 3.1.4 末尾的第 3.1.4 节 DOM 树访问器定义的吗?跨度>
  • @Alohci,在当前规范中未定义。 HTML5 草案为此定义了一种机制,但它也提出了唯一性要求。
  • 是的,公平点。讨论什么是 HTML 4、什么是 HTML5 以及用户代理做什么,考虑到它们没有单独的 HTML 4 和 HTML5 模式,有时会变得非常复杂。
【解决方案2】:

是的,这是允许的,只有 id 必须是唯一的。但是我不推荐它,为什么还要让自己在路上感到困惑。

name 属性仅定义每个表单字段元素在发送到服务器时将被表示为什么。

【讨论】:

  • name 元素的name 属性不会影响发送到服务器的数据。您可能将它与表单字段的name 属性混淆了。
【解决方案3】:

在 HTML5 中也可以。只有名称在表单本身内必须是唯一的。

请参阅文档:“该值不能是空字符串,并且该值在它所在的表单集合中的表单元素中必须是唯一的,如果有的话。”

【讨论】:

  • 这可能会产生误导。在 HTML5 中,W3C requires 表单的 name 在表单集合中是唯一的,如果有的话。但是表单中元素的names 可以是any non-empty string,除了_charset_isindex
【解决方案4】:

当用户单击提交按钮时,只会执行该表单。不过,最好给它们命名,这样你就不会感到困惑了:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2014-03-31
    • 2018-05-21
    • 2016-11-07
    相关资源
    最近更新 更多