在 HTML 表单中包含多个同名“隐藏”控制元素是否合法?我希望在服务器上获取所有这些元素的值。如果合法,主流浏览器是否正确实现了该行为?

有帮助吗?

解决方案

在浏览器与它确定。但是,应用程序库如何解析它可以变化。

程序是假设到组相同的命名项在一起。虽然HTML规范并没有明确说这一点,它是隐含在的上复选框文档

  

的形式的几个复选框可以共享   相同的控制名字。因此,   例如,复选框允许用户   选择相同的几个值   属性。

其他提示

不同的服务器端技术会有所不同。在PHP中,你可以使用数组式的语法名称强制要在服务器端创建一个集合。如果发送到服务器,$_POST['colors']将与两个值,#003366#00FFFF的数组:

<input type="hidden" name="colors[]" value="#003366" />
<input type="hidden" name="colors[]" value="#00FFFF" />

一般来说,你需要使用一个标准的名称的方括号。大多数服务器端技术将能够分析得到的数据,并提供某种类型的集合。 Node.js的通过提供有用的功能 querystring.parse

const querystring = require('querystring')

querystring.parse('foo=bar&abc=xyz&abc=123') // { foo: 'bar', abc: ['xyz', '123'] }

如果你有这样的事情:

<input type="hidden" name="x" value="1" />
<input type="hidden" name="x" value="2" />
<input type="hidden" name="x" value="3" />

您查询字符串会变成看似x=1&x=2&x=3 ......根据你使用解析查询字符串,这可能不是很好地工作的服务器软件。

是,与大多数应用服务器将收集的匹配元素,并用逗号,将它们连接起来,例如,像这样的形式:

<html>
<form method="get" action="http://myhost.com/myscript/test.asp">
<input type="hidden" name="myHidden" value="1">
<input type="hidden" name="myHidden" value="2">
<input type="hidden" name="myHidden" value="3">
<input type="submit" value="Submit">
</form>
</html>

...将解析为一个URL(在GET的情况下 - POST将相同的方式工作,虽然)是这样的:

  

http://myhost.com/myscript.asp?myHidden=1&myHidden = 2&myHidden = 3

...在这样的代码将被暴露给你:(例如,以下是这样回复于(的Request.QueryString( “myHidden”)):

1,2,3

所以抢的值,你只分割字符串,并访问它们作为一个数组(或任何您所选择的语言相媲美)。

(应明确:在PHP,它是稍微不同的(如乔纳森指出,托架符号暴露项作为数组到PHP代码),但ASP,ASP.NET和ColdFusion所有暴露的值作为逗号 - 分隔列表。所以,是的,重复的命名是完全有效的。)

HTML5

非规范部分 4.10.1.3 配置表单与服务器通信 明确表示它是有效的:

多个控件可以具有相同的名称;例如,这里我们给所有复选框赋予相同的名称,服务器通过查看使用该名称提交的值来区分哪个复选框被选中——就像单选按钮一样,它们也被赋予带有 value 属性的唯一值。

其规范版本很简单,在任何地方都不会禁止它,并且表单提交算法准确地说明了应该生成什么请求:

具体地为PHP我提出了一些试验,在隐藏的输入阵列名称和我在这里分享我的结果:

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Post Hidden 2D Arrays</title>
  </head>
  <body>
    <form name="formtest" method="POST" target="_self">
      <input type="hidden" name="elem['name'][]" value="first">
      <input type="hidden" name="elem['name'][]" value="second">
      <input type="hidden" name="elem['name'][]" value="third">
      <input type="hidden" name="elem['name'][]" value="fourth">
      <input type="hidden" name="elem['type'][]" value="normal">
      <input type="hidden" name="elem['type'][]" value="classic">
      <input type="hidden" name="elem['type'][]" value="regular">
      <input type="hidden" name="elem['type'][]" value="basic">
      <input type="hidden" name="elem['size'][]" value="4">
      <input type="hidden" name="elem['size'][]" value="7">
      <input type="hidden" name="elem['size'][]" value="3">
      <input type="hidden" name="elem['size'][]" value="6">
      <input type="hidden" name="elem['form'][]" value="triangle">
      <input type="hidden" name="elem['form'][]" value="square">
      <input type="hidden" name="elem['form'][]" value="hexagon">
      <input type="hidden" name="elem['form'][]" value="circle">
      <input type="submit" name="sendtest" value="Test">
    </form>
    <xmp>
<?php
    print_r($_POST);
?>
    </xmp>
  </body>
</html>

提交表单生成下一个结果是:

Array
(
[elem] => Array
    (
        ['name'] => Array
            (
                [0] => first
                [1] => second
                [2] => third
                [3] => fourth
            )
        ['type'] => Array
            (
                [0] => normal
                [1] => classic
                [2] => regular
                [3] => basic
            )
        ['size'] => Array
            (
                [0] => 4
                [1] => 7
                [2] => 3
                [3] => 6
            )
        ['temp'] => Array
            (
                [0] => triangle
                [1] => square
                [2] => hexagon
                [3] => circle
            )
    )
[sendtest] => Test
)

查看此结果后,我提出更多的测试寻找更好的安排数组值的和与该结束(我将只显示新的隐藏输入):

    <input type="hidden" name="elem[0]['name']" value="first">
    <input type="hidden" name="elem[1]['name']" value="second">
    <input type="hidden" name="elem[2]['name']" value="third">
    <input type="hidden" name="elem[3]['name']" value="fourth">
    <input type="hidden" name="elem[0]['type']" value="normal">
    <input type="hidden" name="elem[1]['type']" value="classic">
    <input type="hidden" name="elem[2]['type']" value="regular">
    <input type="hidden" name="elem[3]['type']" value="basic">
    <input type="hidden" name="elem[0]['size']" value="4">
    <input type="hidden" name="elem[1]['size']" value="7">
    <input type="hidden" name="elem[2]['size']" value="3">
    <input type="hidden" name="elem[3]['size']" value="6">
    <input type="hidden" name="elem[0]['temp']" value="triangle">
    <input type="hidden" name="elem[1]['temp']" value="square">
    <input type="hidden" name="elem[2]['temp']" value="hexagon">
    <input type="hidden" name="elem[3]['temp']" value="circle">

获取提交表单后结果如下:

Array
(
[elem] => Array
    (
        [0] => Array
            (
                ['name'] => first
                ['type'] => normal
                ['size'] => 4
                ['temp'] => triangle
            )
        [1] => Array
            (
                ['name'] => second
                ['type'] => classic
                ['size'] => 7
                ['temp'] => square
            )
        [2] => Array
            (
                ['name'] => third
                ['type'] => regular
                ['size'] => 3
                ['temp'] => hexagon
            )
        [3] => Array
            (
                ['name'] => fourth
                ['type'] => basic
                ['size'] => 6
                ['temp'] => circle
            )
    )
[sendtest] => Test
)

我希望这有助于一些。

我相信它是合法的,至少在单选按钮的情况下和复选框。当我要在XSLT动态地添加文本框输入,我给他们所有相同的名称; ASP.NET中,的Request.Form [“whatever_name”]是所有这些值逗号分隔的字符串。

我已经使用相同的控制名只是试图,县[]数SELECT输入,从而使县英格兰,苏格兰,威尔士和爱尔兰在各自都通过作为相同的参数值。 PHP处理它很好,但HTML验证器会发出警告。我不知道是不是所有的浏览器处理这个同样的方式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top