--- title: slug: Web/HTML/Element/Input/hidden tags: - HTML - Input - 表单 - 输入框 - 输入框属性 - 隐藏表单 translation_of: Web/HTML/Element/input/hidden ---
"hidden" 类型的 {{HTMLElement("input")}} 元素允许 Web 开发者存放一些用户不可见、不可改的数据,在用户提交表单时,这些数据会一并发送出。比如,正被请求或编辑的内容的 ID,或是一个唯一的安全令牌。这些隐藏的 <input>元素在渲染完成的页面中完全不可见,而且没有方法可以使它重新变为可见。
注意:本警告框下面的代码下,就有一个 <input type="hidden"> 的 live example 可交互示例——如果它正常运作的话,你应当什么也看不到!
<input id="prodId" name="prodId" type="hidden" value="xm234jq">
{{ EmbedLiveSample('Basic_example', 600, 40) }}
| 属性值 | {{domxref("DOMString")}}代表您要传递回服务器的隐藏数据的值 |
| 事件 | 无 |
| 支持的公共属性 | {{htmlattrxref("autocomplete", "input")}} |
| IDL 属性 | value |
| 方法 | 无 |
注意:{{HTMLElement("input")}}和change事件不适用于此输入类型。隐藏的输入无法获得焦点, 即使使用 JavaScript 例如 (e.g. hiddenInput.focus())
{{HTMLElement("input")}}元素的{{htmlattrxref("value", "input")}}属性有{{domxref("DOMString")}},其中包含您想提交到服务器的隐藏数据尽管您可以通过浏览器开发人员工具编辑该值,但明确的是,用户不能通过用户界面对其编辑或看到。
重要提示:尽管该值未在页面内容中显示给用户,但可以使用任何浏览器的开发人员工具或 “查看源代码” 功能来查看并进行编辑。 请不要依赖 hidden 输入作为安全表单。
除所有 {{HTMLElement("input")}}元素所共有的属性之外,带有 hidden 属性的 {{HTMLElement("input")}}提供以下额外属性:
| 属性 | 描述 |
|---|---|
name |
与所有输入类型一样,这可以是提交表单时反馈给服务器的 {{HTMLElement("input")}} 的名称;使用特殊属性值 _charset_ 则会使当前隐藏 {{HTMLElement("input")}} 的值被反馈为表单内容的字符编码 |
这实际上是常见属性之一,但它对于隐藏的 {{HTMLElement("input")}} 具有一个特殊含义。一般来说,{{htmlattrxref("name", "input")}} 的属性在隐藏 {{HTMLElement("input")}} 上的作用和任何其他 {{HTMLElement("input")}} 上的一样;但是,在提交表单时, name 属性被设置为 _charset_ 的隐藏 {{HTMLElement("input")}},其值会被自动设置为被提交表单的字符编码。
<input>如上所述,隐藏的 {{HTMLElement("input")}} 可以用于任何有需要提交给服务器的、用户无法查看或编辑的数据的地方。让我们看一些说明其用法的例子吧。
隐藏输入的最常见用途之一是当被编辑的表单提交时,保持跟踪数据库数据的更新。
典型的工作流程如下所示:
在这里的步骤 2 思路中,要被更新的 ID 记录保留在隐藏的输入中。 在步骤 3 中提交表单后,该 ID 随记录内容自动发送回服务器。 该 ID 使站点的服务器端组件确切知道哪些记录需要被提交的数据更新的。
隐藏输入表单还用于存储和提交安全令牌或机密信息,以提高网站的安全性。基本思路是,如果用户填写敏感表格,例如在其银行网站上将某笔款项转入另一个帐户的表格,他们将被提供的密钥和证明他们就是他们所说的真实身份,并且他们使用正确的表单来提交转移请求。
这将阻止恶意用户创建伪造的表单,伪装成银行,然后通过电子邮件将表单发送给毫无戒备心的用户,以诱骗他们将钱转入错误的位置。 这种攻击称为跨站点请求伪造(CSRF);几乎任何信誉良好的服务器端框架都使用隐藏机密来防止此类攻击。
如前所述,将密钥放置在隐藏的输入中并不能使其固有安全性。 密钥的组成和编码已经可以做到这一点。隐藏输入的值是保持它与数据关联性,并在将表单发送到服务器时自动将其包含在内。 您需要使用精心设计的密钥来真正保护您的网站。
隐藏的 {{HTMLElement("input")}} 不参与约束验证;他们没有可受到约束的属性值。
让我们看一下如何使用隐藏输入保存正在被编辑的记录的 ID,实现我们先前描述的编辑表单的简单版本(请参阅 跟踪被编辑的内容)。
编辑表单的 HTML 可能看起来像这样:
<form>
<div>
<label for="title">Post title:</label>
<input type="text" id="title" name="title" value="My excellent blog post">
</div>
<div>
<label for="content">Post content:</label>
<textarea id="content" name="content" cols="60" rows="5">
This is the content of my excellent blog post. I hope you enjoy it!
</textarea>
</div>
<div>
<button type="submit">Update post</button>
</div>
<input type="hidden" id="postId" name="postId" value="34657">
</form>
我们还添加一些简单的 CSS:
html {
font-family: sans-serif;
}
form {
width: 500px;
}
div {
display: flex;
margin-bottom: 10px;
}
label {
flex: 2;
line-height: 2;
text-align: right;
padding-right: 20px;
}
input, textarea {
flex: 7;
font-family: sans-serif;
font-size: 1.1rem;
padding: 5px;
}
textarea {
height: 60px;
}
在将表单发送给用户的浏览器之前,服务器会将 ID "postID"的隐藏输入的值设置为其数据库中发送的 ID,并在返回表单时使用该信息来知道要向哪个数据库记录更新改变后的信息。 内容中无需脚本即可处理。
输出看起来像这样:
{{ EmbedLiveSample('Examples', '100%', 200) }}
提交后,发送到服务器的表单数据将如下所示:
title=My+excellent+blog+post&content=This+is+the+content+of+my+excellent+blog+post.+I+hope+you+enjoy+it!&postId=34657
即使根本看不到隐藏的 {{HTMLElement("input")}},它所包含的数据仍然会被提交给服务器。
| 规范 | 状态 | 备注 |
|---|---|---|
| {{SpecName('HTML WHATWG', 'forms.html#hidden-state-(type=hidden)', '<input type="hidden">')}} | {{Spec2('HTML WHATWG')}} | 初始化定义 |
| {{SpecName('HTML5.1', 'forms.html#hidden-state-(type=hidden)', '<input type="hidden">')}} | {{Spec2('HTML5.1')}} | 初始化定义 |
{{Compat("html.elements.input.input-hidden")}}