有两个具有相同名称的输入元素是否有效?

Roh*_*han 69 html forms validation

即:

<form 1>
<input type="hidden" name="url" value="1">
</form 1>
Run Code Online (Sandbox Code Playgroud)

<form 2>
<input type="hidden" name="url" value="2">
</form 2>
Run Code Online (Sandbox Code Playgroud)

这是允许和有效的吗?

小智 51

是的,它是有效的

这很好

<form name="form1">
  <input type="hidden" name="url" value="1">
</form>

<form name="form2">
  <input type="hidden" name="url" value="2">
</form>
Run Code Online (Sandbox Code Playgroud)

这也很好,通常会被解释为一个值数组,例如{url: [1, 2]},取决于您的服务器的功能.在URL编码中,它看起来像url=1&url=2.

<form name="form1">
  <input type="hidden" name="url" value="1">
  <input type="hidden" name="url" value="2">
</form>
Run Code Online (Sandbox Code Playgroud)

  • 这是有效的.它不会对服务器端语言造成任何混淆(即使是PHP,它的命名字段共享一个名称的约定,将一致且可预测地处理不使用该约定的多个输入).它不会对JavaScript产生混淆(它会将元素显示为集合,而不是**忽略其中之一).对于编写代码而不知道他们正在做什么的作者来说,它/可能/会造成混淆,但规范很好. (23认同)
  • 这篇文章具有误导性.具有相同名称的输入是相同的形式是HTML标准的一部分 - 它们被用于例如复选框. (13认同)
  • 我知道这是一篇旧文章,但需要澄清一下。PHP 需要你告诉它元素正在形成一个数组,如下所示: &lt;code&gt; &lt;input type="hidden" name="url[]" value=....... &lt;/code&gt; 如果你不这样做为此,php 将获取最后一个字段的最后一个值并将其插入到键“url”的表单数组中。 (7认同)

Que*_*tin 10

是.

此外,如果您正在处理单选按钮组,这一点至关重要.

  • @Kerry - 这是一个PHPism.大多数表单处理库都很高兴没有控件组的特殊名称. (2认同)

Ker*_*nes 8

是的 - 每个人只会提交各自的表格.

如果你有相同的形式,一个将覆盖另一个,它是无效的.

  • 你错了.如果您有多个具有相同名称的输入,则一个*不会*覆盖另一个.所有输入都将按照它们在html中出现的顺序附加到请求的正文中.并且它是有效的:[具有多个同名隐藏控件元素的HTML表单](http://stackoverflow.com/questions/452066/html-form-with-multiple-hidden-control-elements-of-the-same-名称) (11认同)
  • 我们在这里讨论HTML,而不是PHP. (6认同)
  • @Mahmoodvcs:这不是严格意义上的.如果表单发布到PHP服务,则最后一个值获胜.如果要为名称分配多个值,则每个名称必须以"[]"结尾. (5认同)
  • @yardpenalty - 我不明白你的问题(不确定Jeff是否会回应),但是如果你质疑PHP的能力,这肯定是正确的(至少在PHP7之前 - 我还没有检查它们是否已经改变那个) (2认同)

Jef*_*ery 8

"这不好"在我知道的每个浏览器上正确解析; 如果两个url出现在url编码的字符串中,它将被视为一个数组.在JQuery中尝试这个:

$('<form name="form1">\
     <input type="hidden" name="url" value="1">\
     <input type="hidden" name="url" value="2">\
</form>').serialize()
Run Code Online (Sandbox Code Playgroud)

你会得到: "url=1&url=2"

一个编写良好的查询字符串解析器将返回一个像这样的json结构:

 {"url":["1", "2"]}
Run Code Online (Sandbox Code Playgroud)

这是严格的规格吗?不,但是我没有通过反斜杠转义EOL来创建多行字符串,就像我上面所做的那样.