【问题标题】:was the name attribute really needed in html? [closed]html 中真的需要 name 属性吗? [关闭]
【发布时间】:2019-10-29 04:32:26
【问题描述】:

如果 HTML 表单中 name 属性的目的只是引用 input 等元素,为什么我们不能简单地使用 id 或 class 属性?创建名称属性背后是否有一些不那么明显的原因。

.....html
 Name: <input type="text" name="fullname"><br>
.....

【问题讨论】:

  • 因为在js形式中使用起来更方便
  • 因为您可能有多个具有相同名称的元素,并且您不会为此使用 class,因为它主要用于 css 并且 name 用于标识已提交的数据
  • 因为你可以有多个类——你不能有多个名字
  • 无论如何,您不能忽略单选按钮的名称属性。顺便说一句,你看过我下面的回答了吗?
  • 更不用说 classid 仅在 HTML4 中引入 - name 早于它们两者;所以你最初的问题是 “为什么我们不能简单地使用 id 或 class 属性?创建名称属性背后是否有一些不那么明显的原因。” 是基于错误的假设。

标签: javascript php html


【解决方案1】:

nameidclass 具有根本不同的目的。

  • name 用于表单元素名称,不需要唯一(事实上,有时您需要重用相同的name)。
  • id 顾名思义,是元素的标识符,在整个文档中必须是唯一的。
  • class 主要用于展示(尽管它有时也用于连接客户端 UI)并且包含元素的类的 list,而不仅仅是单个类。如果您使用class 来识别表单字段,您会使用可能的几个类中的哪一个?

您可以在多个字段上使用相同的name 的方式:

  1. 您可以以不同的形式使用相同的name,而不会产生任何冲突。

  2. 您在表单中使用相同的name 来表示应该组合在一起的单选按钮。

  3. 您可以在表单中为多种其他类型的元素使用相同的name,这些元素的值应全部发送到服务器。

相比之下,id 必须是唯一的 - 不仅在表单中,而且在整个文档中。

#3 可能需要一个例子来说明清楚。假设你有:

<form action="example" method="get">
    <input type="text" name="foo">
    <input type="text" name="foo">
    <input type="text" name="foo">
    <input type="submit" value="Send">
</form>

如果用户在这三个文本字段中填写abc并发送表单,这就是查询字符串:

?foo=a&foo=b&foo=c

注意foo 被重复了。接收资源可以访问所有这三个值。 (也许您正在列出帖子的标签,或者您所有孩子的名字,或者......)

【讨论】:

  • $_GET['foo'] 等于什么
  • @bakero98 - 我不做 PHP。但是 IIRC,如果您的目标是 PHP 后端,您将使用命名约定告诉 PHP 您正在重复字段名称:name="foo[]"。然后 PHP 提供了某种结果数组,类似的东西。不同的后端技术以不同的方式处理它。
  • @T.J.Crowder,关于您的问题 - 如果您使用类来识别表单字段,您会使用可能的几个类中的哪一个?我的回答是 - 在 Html 中,已经有将多个类分配给同一个元素的约定,一个类可能是一个公共类,一个类可能是该元素唯一的。
  • @DeskiRey - 我看不出有任何理由像这样重载类。我们已经有了name(并且在class 之前就已经有了),它特定于它的目的,没有混合样式,也没有多个值。所以... :-)
【解决方案2】:

name和id有一些区别

name不能应用于每个元素,id可以

id 是唯一的,可以应用于每个存在的 dom 元素,并且只能为以下元素设置名称:&lt;a&gt;, &lt;applet&gt;, &lt;button&gt;, &lt;form&gt;, &lt;frame&gt;, &lt;iframe&gt;, &lt;img&gt;, &lt;input&gt;, &lt;map&gt;, &lt;meta&gt;, &lt;object&gt;, &lt;param&gt;, &lt;select&gt;, and &lt;textarea&gt;

id 应该是唯一的,name 不是

id 应该是唯一的,因为函数document.getElementById(id) 只会检索一个元素。 document.getElementsByName(name); 函数将检索所有具有给定名称的 dom 元素

在一个表单dom元素中,元素的名字被添加到发送给浏览器的数据中,id没有

每个有名字的输入 dom 元素,如果他在一个表单元素里面,在表单提交中会将所有输入的值发送到服务器。你可以在here查看这个。

【讨论】:

  • 谢谢,非常感谢您提供的信息。如果我的声誉更高,我会支持你的。
【解决方案3】:

@MisterJojo 有什么例子吗? - 德斯基雷伊

示例 1:

const MyForm = document.getElementById('my-form')

MyForm.onsubmit = e=>{
  e.preventDefault()

  console.log( MyForm.username.value )  // direct access to value with name
}
<form id="my-form">
  <input type="text" name="username">

  <button type="submit">submit</button>
</form>

示例 2:

const MyForm = document.getElementById('my-form')

MyForm.onsubmit = e=>{
  e.preventDefault()

  console.clear()
  console.log( MyForm.RadioABC.value )  // direct access to value with name
}
<form id="my-form">

A: <input type="radio" name="RadioABC" value="A" checked >
B: <input type="radio" name="RadioABC" value="B">
C: <input type="radio" name="RadioABC" value="C">

  <button type="submit">submit</button>
</form>

想要更多?

【讨论】:

  • 谢谢,非常有帮助,如果我的声誉更高,我会给你一个upvote
猜你喜欢
  • 2011-11-23
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 2018-10-23
相关资源
最近更新 更多