具有多个相同名称的隐藏控制元素的HTML表单
具有多个具有相同名称的“隐藏”控制元素的HTML表单是合法的吗? 我期望在服务器上获得所有这些元素的值。 如果这是合法的,主要的浏览器是否正确地实施了这个行为?
浏览器都可以。 但是,应用程序库如何parsing它可能会有所不同。
程序应该将同名的项目组合在一起。 虽然HTML规范没有明确地说明这一点,但在关于checkbox的文档中隐含地声明:
表单中的多个checkbox可以共享相同的控件名称。 因此,例如,checkbox允许用户为同一个属性select多个值。
不同的服务器端技术会有所不同。 使用PHP,可以使用数组样式的名称语法强制在服务器端创build集合。 如果发布到服务器, $_POST['colors']
将是一个包含两个值的数组, #00FFFF
和#00FFFF
:
<input type="hidden" name="colors[]" value="#003366" /> <input type="hidden" name="colors[]" value="#00FFFF" />
一般来说,你会想使用没有方括号的标准名称 。 大多数服务器端技术将能够parsing结果数据,并提供一些types的集合。 Node.js通过querystring.parse
提供了有用的function:
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" />
您的查询string会变成x=1&x=2&x=3
…。根据您用于parsing查询string的服务器软件,这可能无法正常工作。
是的,大多数应用程序服务器将收集匹配的元素,并用逗号连接它们,例如:
<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>
…将parsing为一个URL(在GET的情况下 – POST将以同样的方式,虽然),如下所示:
http://myhost.com/myscript.asp?myHidden=1&myHidden=2&myHidden=3
…并且会以这样的代码暴露给你:(例如,像Response.Write(Request.QueryString(“myHidden”)):
1,2,3
所以为了获得这些值,你只需要将string分开,并以数组的forms访问它们(或者用你select的语言进行比较)。
(应该澄清:在PHP中,它稍有不同(正如Johnathan指出的那样,括号表示将项目作为数组展示给您的PHP代码),但是ASP,ASP.NET和CF都将这些值作为以逗号分隔的列表公开。所以是的,重复的命名是完全有效的。)
HTML5
非规范部分4.10.1.3configuration表单与服务器进行通信明确表示它是有效的:
多个控件可以具有相同的名称; 例如,在这里,我们给所有的checkbox同名,服务器通过查看哪个值被提交了这个名称来区分哪个checkbox被选中 – 就像单选button一样,它们也被赋予了唯一的value属性值。
这个规范的版本只是简单地说,它在任何地方都是不被禁止的,表单提交algorithm确切地说明了应该生成的请求:
- 没有违反约束: https : //www.w3.org/TR/html5/forms.html#constraints
- 将多个名称依次添加到“表单数据集”中: https : //www.w3.org/TR/html5/forms.html#constructing-form-data-set
- 编码像
application/x-www-form-urlencoded
循环遍历“表单数据集”并吐出多个key=val
https://www.w3.org/TR/html5/forms.html#url-encoded-form-数据;
特别是对于PHP我做了隐藏input数组名称的一些testing,我在这里分享我的结果:
<!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>
我相信这是合法的,至less在单选button和checkbox的情况下。 当我必须在XSLT中dynamic地添加文本框input时,我给他们所有相同的名字; 在ASP.NET中,Request.Form [“whatever_name”]是逗号分隔的所有这些值的string。
我刚刚尝试使用相同的控制名称,县[]为几个SELECTinput,以便在每个英格兰,苏格兰,威尔士和爱尔兰县都是作为相同的参数值传递。 PHP处理它很好,但HTMLvalidation器给出警告。 我不知道所有的浏览器是否会以同样的方式处理。