【问题标题】:Do input names have to be unique in the same form?输入名称必须以相同的形式唯一吗?
【发布时间】:2014-08-18 13:47:40
【问题描述】:

我有一个包含多个fieldsets 的表单。每个fieldset 有多个inputs,其中一些逻辑上共享一个name 属性。

我看过MDN for input nameHTML 5 spec,但没有运气。不过,HTML 5 表单规范的第 4.10.19.1 节并未提及唯一性要求。

例如:

<fieldset name="attendee"> 
  <input name="full-name">
</fieldset> 

<fieldset name="next-of-kin"> 
  <input name="full-name">
</fieldset>

每个input 名称在fieldset 中都是唯一的,但在form 中重复。这是有效的吗?

【问题讨论】:

  • 您是否尝试过为 html5 文档类型使用 w3c 验证器?
  • 它必须至少对单选按钮有效,否则您无法创建单选按钮组。其他输入状态似乎没有任何限制(在您的情况下,默认文本状态)。
  • @Musa 很好的问题。是的,它验证(添加了周围的正文、文档类型等)。重复名称没有警告。

标签: html forms fieldset


【解决方案1】:

不,name 属性不需要是唯一的。您可以在多个输入字段中具有相似的 name 属性(例如,单选按钮背后的整个原理)。当您提交表单时,现代浏览器通常会看到一系列信息。我给你举个例子,我用 PHP 来解析信息,但重点在于其他编程语言。

举个例子:

<fieldset name="attendee"> 
  <input name="full-name">
</fieldset> 

<fieldset name="next-of-kin"> 
  <input name="full-name">
</fieldset>

如果您 var_dump() 取决于您的方法 POST/GET,您将看到浏览器实际上只记住了 full-name 属性记录的最后一个值。基本上,如果您的第一个输入是John Doe(在attendee 字段集下),而您的第二个输入是John Green(在next-of-kin 字段集下),则无论您使用哪种方法,浏览器都只会记住John Green。如果您使用 GET 方法,则只有您的 URL 将包含两个 full-name 属性,而不是实际的 $_GET 数组本身。

如果您想记录这两个名称,您可以将代码编辑为:

<fieldset name="attendee"> 
  <input name="full-name[]">
</fieldset> 

<fieldset name="next-of-kin"> 
  <input name="full-name[]">
</fieldset>

通过使用[],浏览器知道不要只记住该属性的最后一个值。现在,如果您执行var_dump(),无论您使用哪种方法,您都应该看到:

array(1) { ["full-name"]=> array(2) { 
                          [0]=> string(8) "John Doe" 
                          [1]=> string(10) "John Green" 
                          } 
         }

如果您想更具体一些(因为您在其中一个 cmet 中提到您在 REST API 中使用它),您可以像这样编辑您的代码:

<fieldset name="attendee"> 
  <input name="full-name[attendee]">
</fieldset> 

<fieldset name="next-of-kin"> 
  <input name="full-name[next-of-kin]">
</fieldset>

现在如果你提交表单,不管是什么方法,你都会得到如下的数据结构:

array(1) { ["full-name"]=> array(2) { 
                          ["attendee"]=> string(8) "John Doe" 
                          ["next-of-kin"]=> string(10) "John Green" 
                          } 
         }

从这里调用这个数组上的json_encode() 并获得一个可以与 API 一起使用的实际 JSON 对象(如下所示)是相当简单的:

{"full-name":{"attendee":"John Doe","next-of-kin":"John Green"}}

【讨论】:

    【解决方案2】:

    我建议给每个字段一个不同的名称,

    例如,如果您有两个字段,使用 GET 方法,URL 中的名称/值对将如下所示:

    index.html?attendee=random&full-name=random2&next-of-kin=random3&full-name=random4

    对于此代码:

    <fieldset name="attendee"> 
      <input name="full-name">
    </fieldset> 
    
    <fieldset name="next-of-kin"> 
      <input name="full-name">
    </fieldset>
    

    那么后端会加载哪些数据,如果调用的标识符相同但数据不同呢?

    如果您没有后端,并且只使用名称字段作为选择器,我建议您使用class="" 字段。

    【讨论】:

    • 我有一个后端,正在 POST 到一个 REST API。
    【解决方案3】:

    如果您打算使用 ID 选择器(javascript 或 Jquery)来操作这些字段,并且希望将功能分开,那么我将使用唯一 ID。如果您打算选择元素,指定一个 id 标签会更好。

    <fieldset id="attendeeMain" name="attendee"> 
    <input name="full-name">
    </fieldset> 
    
    <fieldset id="nextOfKin" name="next-of-kin"> 
     input name="full-name">
    </fieldset>
    

    【讨论】:

    • 感谢您尝试回答这个问题,但您没有在任何地方引用任何规范,问题是关于允许的具体内容。我已经可以按名称选择字段集,不需要 ID,并在大多数浏览器中创建 JavaScript 全局变量。
    猜你喜欢
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多