1. 4.10.17 表单控件基础设施
        1. 4.10.17.1 表单控件的值
        2. 4.10.17.2 可变性
        3. 4.10.17.3 控件和表单的关联
      2. 4.10.18 表单控件的通用属性
        1. 4.10.18.1 为表单控件命名:name 属性
        2. 4.10.18.2 提交元素的方向性:dirname 属性
        3. 4.10.18.3 限制用户输入长度:maxlength 属性
        4. 4.10.18.4 设置最小输入长度要求:minlength 属性
        5. 4.10.18.5 启用和禁用表单控件:disabled 属性
        6. 4.10.18.6 表单提交属性
        7. 4.10.18.7 自动填充
          1. 4.10.18.7.1 自动填充表单控件:autocomplete 属性
          2. 4.10.18.7.2 处理模型
      3. 4.10.19 文本控件选择的 API
      4. 4.10.20 约束
        1. 4.10.20.1 定义
        2. 4.10.20.2 约束验证
        3. 4.10.20.3 约束验证 API
        4. 4.10.20.4 安全性
      5. 4.10.21 表单提交
        1. 4.10.21.1 简介
        2. 4.10.21.2 隐式提交
        3. 4.10.21.3 表单提交算法
        4. 4.10.21.4 构造条目列表
        5. 4.10.21.5 选择表单提交编码
        6. 4.10.21.6 将条目列表转换为名称-值对列表
        7. 4.10.21.7 URL 编码的表单数据
        8. 4.10.21.8 多部分表单数据
        9. 4.10.21.9 纯文本表单数据
        10. 4.10.21.10 SubmitEvent 接口
        11. 4.10.21.11 FormDataEvent 接口
      6. 4.10.22 重置表单

4.10.17 表单控件基础设施

4.10.17.1 表单控件的值

大多数表单控件都有一个 和一个 选中状态。(后者仅由 input 元素使用。)这些用于描述用户如何与控件交互。

控件的 是其内部状态。因此,它可能与用户的当前输入不匹配。

例如,如果用户在 数字字段(需要数字)中输入单词“three”,则用户的输入将是字符串“three”,但控件的 将保持不变。或者,如果用户在 电子邮件字段中输入电子邮件地址“  [email protected]”(带有前导空格),则用户的输入将是字符串“  [email protected]”,但电子邮件字段的浏览器 UI 可能会将其转换为 [email protected]”(不带前导空格)。

inputtextarea 元素具有 脏值标志。这用于跟踪 和默认值之间的交互。如果为 false,则 会反映默认值。如果为 true,则会忽略默认值。

inputtextareaselect 元素具有一个 用户有效性 布尔值。最初设置为 false。

为了定义在 input 元素的 multiple 属性面前约束验证的行为,input 元素也可以分别定义 s

为了定义 maxlengthminlength 属性的行为,以及特定于 textarea 元素的其他 API,所有具有 的表单控件也都有一个用于获取 API 值 的算法。默认情况下,此算法只是返回控件的

select 元素没有 ;而是使用其 option 元素的 选中状态

4.10.17.2 可变性

表单控件可以指定为 可变的

这决定了(通过本规范中依赖于元素是否如此指定的定义和要求)用户是否可以修改表单控件的 选中状态,或者控件是否可以自动预填充。

4.10.17.3 控件和表单的关联

一个 与表单关联的元素 可以与一个 form 元素存在关系,这称为元素的 表单所有者。如果一个 与表单关联的元素 未与 form 元素关联,则其 表单所有者 被认为是 null。

一个 与表单关联的元素 具有一个关联的 解析器插入标志

Element/input#form

所有当前引擎都支持。

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (旧版)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

Attributes#attr-form

所有当前引擎都支持。

Firefox1+Safari≤4+Chrome1+
Opera≤12.1+Edge79+
Edge (旧版)12+Internet Explorer≤6+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android≤12.1+

一个 与表单关联的元素 默认情况下与其最近的祖先 form 元素关联(如下所述),但是,如果它 已列出,则可以指定 form 属性来覆盖此关联。

此功能允许作者解决嵌套 form 元素缺乏支持的问题。

如果一个 已列出与表单关联的元素 指定了 form 属性,则该属性的值必须是元素 form 元素的 ID

本节中的规则因以下事实而变得复杂:尽管符合规范的文档或 永远不会包含嵌套的 form 元素,但完全有可能(例如,使用执行 DOM 操作的脚本)生成具有此类嵌套元素的 。它们也因 HTML 解析器中的规则而变得复杂,由于历史原因,这些规则可能导致 与表单关联的元素 与不是其祖先的 form 元素关联。

当创建 与表单关联的元素 时,其 表单所有者 必须初始化为 null(没有所有者)。

与表单关联的元素 将要与表单 关联 时,其 表单所有者 必须设置为该表单。

已列出与表单关联的元素form 属性被设置、更改或删除时,则用户代理必须 重置该元素的表单所有者

已列出与表单关联的元素 具有 form 属性,并且 中任何元素的 ID 发生更改时,则用户代理必须 重置该 与表单关联的元素 的表单所有者。

当一个已列出与表单关联的元素具有form 属性,并且一个具有ID的元素被插入到文档移除时,则用户代理必须重置该与表单关联的元素的表单所有者。

表单所有者也会被 HTML 标准的插入步骤移除步骤重置。

重置一个与表单关联的元素element的表单所有者

  1. 取消设置element解析器插入标志

  2. 如果以下所有条件都为真

    则返回。

  3. element表单所有者设置为 null。

  4. 如果element列出,具有form 内容属性,并且已连接,则

    1. 如果在element中,按照树的顺序,第一个具有ID且与elementform 内容属性的值相同的元素是一个表单元素,则关联element与该表单元素。

  5. 否则,如果element具有祖先表单元素,则关联element与其最近的祖先表单元素。

在以下非符合规范的代码片段中

...
 <form id="a">
  <div id="b"></div>
 </form>
 <script>
  document.getElementById('b').innerHTML =
     '<table><tr><td></form><form id="c"><input id="d"></table>' +
     '<input id="e">';
 </script>
...

"d" 的表单所有者将是内部嵌套表单 "c",而 "e" 的表单所有者将是外部表单 "a"。

这是如下发生的:首先,"e" 节点在HTML 解析器中与 "c" 关联。然后,innerHTML 算法将节点从临时文档移动到 "b" 元素。此时,节点会看到其祖先链发生变化,因此解析器完成的所有“神奇”关联都会重置为正常的祖先关联。

不过,此示例是一个非符合规范的文档,因为它违反了内容模型中嵌套表单元素的规则,并且对于 </form> 标记存在解析错误

element.form

HTMLObjectElement/form

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (旧版)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLSelectElement/form

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (旧版)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

返回元素的表单所有者

如果没有表单所有者,则返回 null。

已列出与表单关联的元素(除了与表单关联的自定义元素)具有form IDL 属性,在获取时,必须返回元素的表单所有者,如果没有表单所有者,则返回 null。

ElementInternals/form

所有当前引擎都支持。

Firefox98+Safari16.4+Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

与表单关联的自定义元素没有form IDL 属性。相反,它们的ElementInternals 对象具有form IDL 属性。在获取时,如果目标元素不是与表单关联的自定义元素,则必须抛出"NotSupportedError"DOMException。否则,必须返回元素的表单所有者,如果没有表单所有者,则返回 null。

4.10.18 表单控件的通用属性

4.10.18.1 命名表单控件:name 属性

Element/input#name

所有当前引擎都支持。

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (旧版)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

name 内容属性提供表单控件的名称,在表单提交表单元素的elements对象中使用。如果指定了该属性,则其值不能是空字符串或 isindex

许多用户代理在历史上实现了对表单中第一个文本控件(名称为 isindex)的特殊支持,并且此规范之前为此定义了相关的用户代理要求。但是,一些用户代理随后放弃了这种特殊支持,并且相关的要求已从此规范中删除。因此,为了避免在旧版用户代理中出现有问题的重新解释,不再允许使用名称 isindex

除了 isindex 之外,允许任何非空值作为name。名称_charset_ASCII 不区分大小写匹配是特殊的:如果用作没有value 属性的隐藏控件的名称,则在提交期间,value 属性会自动获得一个值,该值由提交字符编码组成。

name IDL 属性必须反映name 内容属性。

DOM 覆盖是安全问题的一个常见原因。避免使用内置表单属性的名称作为name 内容属性。

在此示例中,input 元素覆盖了内置的method 属性

let form = document.createElement("form");
let input = document.createElement("input");
form.appendChild(input);

form.method;           // => "get"
input.name = "method"; // DOM clobbering occurs here
form.method === input; // => true

由于 input 名称优先于内置表单属性,因此 JavaScript 引用 form.method 将指向名为“method”的input 元素,而不是内置的method 属性。

4.10.18.2 提交元素方向性:dirname 属性

Element/input#dirname

所有当前引擎都支持。

Firefox116+Safari6+Chrome17+
Opera12.1+Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

表单控件元素上的dirname 属性启用元素方向性的提交,并在表单提交期间提供包含此值的控件的名称。如果指定了此类属性,则其值不能是空字符串。

在此示例中,表单包含一个文本控件和一个提交按钮

<form action="addcomment.cgi" method=post>
 <p><label>Comment: <input type=text name="comment" dirname="comment.dir" required></label></p>
 <p><button name="mode" type=submit value="add">Post Comment</button></p>
</form>

当用户提交表单时,用户代理包含三个字段,一个名为“comment”,一个名为“comment.dir”,一个名为“mode”;因此,如果用户键入“Hello”,则提交主体可能类似于

comment=Hello&comment.dir=ltr&mode=add

如果用户手动切换到从右到左的书写方向并输入“مرحبا”,则提交主体可能类似于

comment=%D9%85%D8%B1%D8%AD%D8%A8%D8%A7&comment.dir=rtl&mode=add
4.10.18.3 限制用户输入长度:maxlength 属性

表单控件的 maxlength 属性,受 脏值标志 控制,声明了用户可以输入字符数量的限制。字符数量使用 长度 测量,对于 textarea 元素,所有换行符都规范化为单个字符(而不是 CRLF 对)。

如果某个元素指定了 表单控件的 maxlength 属性,则该属性的值必须是 有效的非负整数。如果指定了该属性,并且将其值应用于 解析非负整数的规则 会得到一个数字,则该数字就是元素的 最大允许值长度。如果省略该属性或解析其值导致错误,则没有 最大允许值长度

约束验证:如果某个元素具有 最大允许值长度,其 脏值标志 为 true,其 上次由用户编辑更改(而不是由脚本更改),并且元素的 长度 超过元素的 最大允许值长度,则该元素 过长

用户代理可以阻止用户将元素的 API 值 设置为 长度 超过元素的 最大允许值长度 的值。

对于 textarea 元素,API 值 不同。特别是,在检查 最大允许值长度 之前会应用 换行符规范化(而不会应用 textarea 换行转换)。

4.10.18.4 设置最小输入长度要求:minlength 属性

表单控件的 minlength 属性,受 脏值标志 控制,声明了用户可以输入字符数量的下限。“字符数量”使用 长度 测量,对于 textarea 元素,所有换行符都规范化为单个字符(而不是 CRLF 对)。

minlength 属性并不意味着 required 属性。如果表单控件没有 required 属性,则仍然可以省略值;只有当用户输入了任何值后,minlength 属性才会生效。如果不允许空字符串,则还需要设置 required 属性。

如果某个元素指定了 表单控件的 minlength 属性,则该属性的值必须是 有效的非负整数。如果指定了该属性,并且将其值应用于 解析非负整数的规则 会得到一个数字,则该数字就是元素的 最小允许值长度。如果省略该属性或解析其值导致错误,则没有 最小允许值长度

如果某个元素同时具有 最大允许值长度最小允许值长度,则 最小允许值长度 必须小于或等于 最大允许值长度

约束验证:如果某个元素具有 最小允许值长度,其 脏值标志 为 true,其 上次由用户编辑更改(而不是由脚本更改),其 不是空字符串,并且元素的 长度 小于元素的 最小允许值长度,则该元素 过短

在这个示例中,有四个文本控件。第一个是必填的,并且必须至少 5 个字符长。其他三个是可选的,但如果用户填写了其中一个,则用户必须输入至少 10 个字符。

<form action="/events/menu.cgi" method="post">
 <p><label>Name of Event: <input required minlength=5 maxlength=50 name=event></label></p>
 <p><label>Describe what you would like for breakfast, if anything:
    <textarea name="breakfast" minlength="10"></textarea></label></p>
 <p><label>Describe what you would like for lunch, if anything:
    <textarea name="lunch" minlength="10"></textarea></label></p>
 <p><label>Describe what you would like for dinner, if anything:
    <textarea name="dinner" minlength="10"></textarea></label></p>
 <p><input type=submit value="Submit Request"></p>
</form>
4.10.18.5 启用和禁用表单控件:disabled 属性

属性/disabled

所有当前引擎都支持。

Firefox1+Safari4+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet ExplorerYes
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

属性/disabled

所有当前引擎都支持。

Firefox4+Safari6+Chrome20+
Opera12+Edge79+
Edge (Legacy)12+Internet ExplorerYes
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12+

属性/disabled

所有当前引擎都支持。

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (旧版)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

属性/disabled

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera?Edge79+
Edge (Legacy)12+Internet ExplorerYes
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

属性/disabled

所有当前引擎都支持。

Firefox1+Safari4+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer6+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

disabled 内容属性是一个 布尔属性

disabled 属性用于 option 元素,disabled 属性用于 optgroup 元素,它们是分别定义的。

如果以下任何一项为真,则表单控件 已禁用

禁用 的表单控件必须阻止在 用户交互任务源 上排队的任何 click 事件在该元素上分派。

约束验证:如果某个元素 已禁用,则 不进行约束验证

HTMLButtonElement/disabled

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (旧版)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLSelectElement/disabled

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera9+Edge79+
Edge (旧版)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android10.1+

disabled IDL 属性必须 反映 disabled 内容属性。

4.10.18.6 表单提交属性

元素/表单#表单提交属性

所有当前引擎都支持。

Firefox4+Safari10.1+Chrome10+
Opera?Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android?

表单提交属性 可以同时在 form 元素和 提交按钮(表示提交表单的按钮的元素,例如 input 元素,其 type 属性处于 提交按钮 状态)上指定。

可以在 form 元素上指定的 表单提交属性actionenctypemethodnovalidatetarget

可以在 提交按钮 上指定的相应的 表单提交属性formactionformenctypeformmethodformnovalidateformtarget。当省略时,它们默认为 form 元素上相应属性的值。


元素/输入#formaction

所有当前引擎都支持。

Firefox4+Safari5+Chrome9+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android3+Samsung Internet?Opera Android12.1+

如果指定了 actionformaction 内容属性,则其值必须是 可能包含空格的有效非空 URL

元素的 action 是元素的 formaction 属性的值(如果该元素是 提交按钮 并且具有此属性),或者其 表单所有者action 属性的值(如果它具有该属性),否则为空字符串。


元素/输入#formmethod

所有当前引擎都支持。

Firefox4+Safari5+Chrome9+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android3+Samsung Internet?Opera Android12.1+

methodformmethod 内容属性是 枚举属性,具有以下关键字和状态

关键字状态简要说明
get GET 指示 form 将使用 HTTP GET 方法。
post POST 指示 form 将使用 HTTP POST 方法。
dialog Dialog 指示 form 旨在关闭表单所在的 dialog 框(如果有),否则不提交。

method 属性的 缺失值默认值无效值默认值 均为 GET 状态。

formmethod 属性没有 缺失值默认值,其 无效值默认值GET 状态。

元素的 method 是这些状态之一。如果该元素是 提交按钮 并且具有 formmethod 属性,则该元素的 method 为该属性的状态;否则,为 表单所有者method 属性的状态。

此处 method 属性用于显式指定默认值“get”,以便在 URL 中提交搜索查询

<form method="get" action="/search.cgi">
 <p><label>Search terms: <input type=search name=q></label></p>
 <p><input type=submit></p>
</form>

另一方面,此处 method 属性用于指定值“post”,以便在 HTTP 请求的主体中提交用户的消息

<form method="post" action="/post-message.cgi">
 <p><label>Message: <input type=text name=m></label></p>
 <p><input type=submit value="Submit message"></p>
</form>

在此示例中,formdialog 一起使用。 method 属性的“dialog”关键字用于在提交表单时自动关闭对话框。

<dialog id="ship">
 <form method=dialog>
  <p>A ship has arrived in the harbour.</p>
  <button type=submit value="board">Board the ship</button>
  <button type=submit value="call">Call to the captain</button>
 </form>
</dialog>
<script>
 var ship = document.getElementById('ship');
 ship.showModal();
 ship.onclose = function (event) {
   if (ship.returnValue == 'board') {
     // ...
   } else {
     // ...
   }
 };
</script>

元素/输入#formenctype

所有当前引擎都支持。

Firefox4+Safari5+Chrome9+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android3+Samsung Internet?Opera Android12.1+

enctypeformenctype 内容属性是 枚举属性,具有以下关键字和状态

该属性的 缺失值默认值无效值默认值 均为 application/x-www-form-urlencoded 状态。

formenctype 属性没有 缺失值默认值,其 无效值默认值application/x-www-form-urlencoded 状态。

元素的 enctype 是这三种状态之一。如果该元素是 提交按钮 并且具有 formenctype 属性,则该元素的 enctype 为该属性的状态;否则,为 表单所有者enctype 属性的状态。


元素/输入#formtarget

所有当前引擎都支持。

Firefox4+Safari5+Chrome9+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android3+Samsung Internet?Opera Android12.1+

如果指定了 targetformtarget 内容属性,则其值必须是 有效的可导航目标名称或关键字


元素/输入#formnovalidate

所有当前引擎都支持。

Firefox4+Safari5+Chrome4+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS4+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

novalidateformnovalidate 内容属性是 布尔属性。如果存在,则表示在提交过程中不应验证表单。

如果该元素是 提交按钮 并且该元素的 formnovalidate 属性存在,或者如果该元素的 表单所有者novalidate 属性存在,则元素的 no-validate 状态 为 true,否则为 false。

此属性对于在具有验证约束的表单上包含“保存”按钮很有用,以允许用户保存其进度,即使他们尚未在表单中完全输入数据。以下示例显示了一个简单的表单,该表单有两个必填字段。有三个按钮:一个用于提交表单,需要填写这两个字段;一个用于保存表单,以便用户以后可以返回并填写;一个用于完全取消表单。

<form action="editor.cgi" method="post">
 <p><label>Name: <input required name=fn></label></p>
 <p><label>Essay: <textarea required name=essay></textarea></label></p>
 <p><input type=submit name=submit value="Submit essay"></p>
 <p><input type=submit formnovalidate name=save value="Save essay"></p>
 <p><input type=submit formnovalidate name=cancel value="Cancel"></p>
</form>

HTMLFormElement/action

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (旧版)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLFormElement/target

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (旧版)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLFormElement/method

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (旧版)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLFormElement/enctype

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer6+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLFormElement/encoding

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera12.1+Edge79+
Edge (旧版)12+Internet Explorer5.5+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

action IDL 属性必须反映同名内容属性,但获取时,如果内容属性缺失或其值为空字符串,则必须返回元素的节点文档URLtarget IDL 属性必须反映同名内容属性。methodenctype IDL 属性必须反映各自同名的内容属性,仅限于已知值encoding IDL 属性必须反映enctype 内容属性,仅限于已知值noValidate IDL 属性必须反映novalidate 内容属性。formAction IDL 属性必须反映formaction 内容属性,但获取时,如果内容属性缺失或其值为空字符串,则必须返回元素的节点文档URLformEnctype IDL 属性必须反映formenctype 内容属性,仅限于已知值formMethod IDL 属性必须反映formmethod 内容属性,仅限于已知值formNoValidate IDL 属性必须反映formnovalidate 内容属性。formTarget IDL 属性必须反映formtarget 内容属性。

4.10.18.7 自动填充
4.10.18.7.1 自动填充表单控件:autocomplete 属性

属性/autocomplete

所有当前引擎都支持。

Firefox4+Safari6+Chrome14+
Opera12.1+Edge79+
Edge (旧版)Internet Explorer
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

用户代理有时具有帮助用户填写表单的功能,例如根据用户之前的输入预填充用户的地址。autocomplete 内容属性可用于提示用户代理如何(或者是否)提供此类功能。

此属性有两种使用方式。当扮演自动填充预期角色时,autocomplete 属性描述了用户期望的输入。当扮演自动填充锚点角色时,autocomplete 属性描述了给定值的含义。

input 元素上,如果其type 属性处于隐藏状态,则autocomplete 属性扮演自动填充锚点角色。在所有其他情况下,它扮演自动填充预期角色

当扮演自动填充预期角色时,如果指定了autocomplete 属性,则其值必须是按顺序排列的由空格分隔的标记集,该标记集包含以下内容之一:单个标记,该标记与字符串“off”进行ASCII 不区分大小写匹配;或单个标记,该标记与字符串“on”进行ASCII 不区分大小写匹配;或自动填充详细信息标记

当扮演自动填充锚点角色时,如果指定了autocomplete 属性,则其值必须是按顺序排列的由空格分隔的标记集,该标记集仅包含自动填充详细信息标记(即,不允许使用“on”和“off”关键字)。

自动填充详细信息标记如下所示,按以下顺序排列

  1. 可选地,一个标记,其前八个字符与字符串“section-”进行ASCII 不区分大小写匹配,表示该字段属于指定的组。

    例如,如果表单中有两个送货地址,则可以将其标记为

    <fieldset>
     <legend>Ship the blue gift to...</legend>
     <p> <label> Address:     <textarea name=ba autocomplete="section-blue shipping street-address"></textarea> </label>
     <p> <label> City:        <input name=bc autocomplete="section-blue shipping address-level2"> </label>
     <p> <label> Postal Code: <input name=bp autocomplete="section-blue shipping postal-code"> </label>
    </fieldset>
    <fieldset>
     <legend>Ship the red gift to...</legend>
     <p> <label> Address:     <textarea name=ra autocomplete="section-red shipping street-address"></textarea> </label>
     <p> <label> City:        <input name=rc autocomplete="section-red shipping address-level2"> </label>
     <p> <label> Postal Code: <input name=rp autocomplete="section-red shipping postal-code"> </label>
    </fieldset>
  2. 可选地,一个标记,该标记与以下字符串之一进行ASCII 不区分大小写匹配

  3. 以下两个选项之一

  4. 可选地,一个与字符串"webauthn"进行ASCII不区分大小写匹配的标记,表示当用户与表单控件交互时,用户代理应显示通过条件中介可用的公钥凭据webauthn仅对inputtextarea元素有效。

如前所述,属性及其关键字的含义取决于属性所扮演的角色。

当扮演自动填充期望角色时……

关键字"off"表示控件的输入数据特别敏感(例如核武器的激活码);或者它是一个永远不会重复使用的值(例如银行登录的一次性密钥),因此用户每次都必须显式输入数据,而不是依赖UA为其预填充值;或者文档提供了自己的自动填充机制,并且不希望用户代理提供自动填充值。

关键字"on"表示允许用户代理向用户提供自动填充值,但未提供有关用户可能期望输入哪种数据的任何其他信息。用户代理必须使用启发式方法来决定建议哪些自动填充值。

上面列出的自动填充字段表示允许用户代理向用户提供自动填充值,并指定期望哪种类型的值。每个此类关键字的含义在下面的表格中描述。

如果省略了autocomplete属性,则改为使用与元素的表单所有者autocomplete属性状态相对应的默认值("on"或"off")。如果没有表单所有者,则使用值"on"。

当扮演自动填充锚点角色时……

上面列出的自动填充字段表示为该元素提供的特定类型的值的值。每个此类关键字的含义在下面的表格中描述。

在此示例中,页面已明确指定交易的货币和金额。表单请求信用卡和其他账单详细信息。用户代理可以使用这些信息来建议它知道具有足够余额并支持相关货币的信用卡。

<form method=post action="step2.cgi">
 <input type=hidden autocomplete=transaction-currency value="CHF">
 <input type=hidden autocomplete=transaction-amount value="15.00">
 <p><label>Credit card number: <input type=text inputmode=numeric autocomplete=cc-number></label>
 <p><label>Expiry Date: <input type=month autocomplete=cc-exp></label>
 <p><input type=submit value="Continue...">
</form>

下表描述了自动填充字段关键字之间的关系。此表中每一行上列出的字段名称对应于该行在标有“含义”的列中的单元格中给出的含义。某些字段对应于其他字段的子部分;例如,信用卡有效期可以使用一个字段来表示有效期的月份和年份("cc-exp"),或者使用两个字段,一个表示月份("cc-exp-month"),另一个表示年份("cc-exp-year")。在这种情况下,较宽字段的名称覆盖多行,其中定义了较窄字段。

通常,鼓励作者使用较宽的字段而不是较窄的字段,因为较窄的字段往往会暴露西方偏见。例如,虽然在某些西方文化中,按顺序使用名字和姓氏很常见(因此通常称为),但许多文化将姓氏放在前面,名字放在后面,许多其他文化只使用一个名字(单名)。因此,使用单个字段更灵活。

某些字段仅适用于某些表单控件。自动填充字段名称不适用于控件,如果控件不属于描述该自动填充字段的第一行第五列中列出的组,则该自动填充字段不适用于该控件。每个组包含哪些控件将在下表下方进行描述。

字段名称含义规范格式规范格式示例控件组
"name"全名自由格式文本,无换行符Sir Timothy John Berners-Lee, OM, KBE, FRS, FREng, FRSA文本
"honorific-prefix"前缀或头衔(例如,“先生”、“女士”、“博士”、“Mlle”)自由格式文本,无换行符Sir文本
"given-name"名字(在某些西方文化中,也称为自由格式文本,无换行符Timothy文本
"additional-name"其他名称(在某些西方文化中,也称为中间名,除第一个名字以外的其他名字)自由格式文本,无换行符John文本
"family-name"姓氏(在某些西方文化中,也称为自由格式文本,无换行符Berners-Lee文本
"honorific-suffix"后缀(例如,“Jr.”、“B.Sc.”、“MBASW”、“II”)自由格式文本,无换行符OM, KBE, FRS, FREng, FRSA文本
"nickname"昵称、屏幕名称、句柄:通常用作全名替代的简短名称自由格式文本,无换行符Tim文本
"organization-title"职称(例如,“软件工程师”、“高级副总裁”、“副总经理”)自由格式文本,无换行符教授

文本
"username"用户名自由格式文本,无换行符timbl用户名
"new-password"新密码(例如,创建帐户或更改密码时)自由格式文本,无换行符GUMFXbadyrS3密码
"current-password"username字段标识的帐户的当前密码(例如,登录时)自由格式文本,无换行符qwerty密码
"one-time-code"用于验证用户身份的一次性验证码自由格式文本,无换行符123456 密码
"organization"与该字段关联的其他字段中的人员、地址或联系信息对应的公司名称自由格式文本,无换行符万维网联盟文本
"street-address"街道地址(多行,保留换行符)自由文本32 Vassar Street
MIT Room 32-G524
多行
"address-line1"街道地址(每个字段一行)自由格式文本,无换行符32 Vassar Street文本
"address-line2"自由格式文本,无换行符MIT Room 32-G524文本
"address-line3"自由格式文本,无换行符 文本
"address-level4"在具有四个行政级别的地址中,最细粒度的行政级别自由格式文本,无换行符 文本
"address-level3"在具有三个或更多行政级别的地址中,第三个行政级别自由格式文本,无换行符 文本
"address-level2"在具有两个或更多行政级别的地址中,第二个行政级别;在具有两个行政级别的国家/地区中,这通常是包含相关街道地址的城市、城镇、村庄或其他地区自由格式文本,无换行符剑桥文本
"address-level1"地址中最广泛的行政级别,即包含该地区的省份;例如,在美国,这将是州;在瑞士,这将是州;在英国,这将是邮政镇自由格式文本,无换行符MA文本
"country"国家代码有效的ISO 3166-1-alpha-2 国家代码 [ISO3166]美国文本
"country-name"国家名称自由文本,无换行符;在某些情况下派生自country美国文本
"postal-code"邮政编码、邮编、邮政编码、CEDEX 代码(如果为 CEDEX,则附加“CEDEX”,以及相关的arrondissement,如果相关,则附加到address-level2字段)自由格式文本,无换行符02139 文本
"cc-name"支付工具上提供的全名自由格式文本,无换行符蒂姆·伯纳斯-李文本
"cc-given-name"支付工具上提供的名字(在某些西方文化中,也称为名字自由格式文本,无换行符Tim文本
"cc-additional-name"支付工具上提供的其他名称(在某些西方文化中,也称为中间名,除了第一个名字以外的其他名字)自由格式文本,无换行符 文本
"cc-family-name"支付工具上提供的姓氏(在某些西方文化中,也称为姓氏姓氏自由格式文本,无换行符Berners-Lee文本
"cc-number"识别支付工具的代码(例如,信用卡号)ASCII 数字 4114360123456785 文本
"cc-exp"支付工具的有效期有效的月份字符串 2014-12 月份
"cc-exp-month"支付工具有效期的月份部分介于 1..12 之间的有效整数12 数字
"cc-exp-year"支付工具有效期的年份部分大于零的有效整数2014 数字
"cc-csc"支付工具的安全码(也称为卡片安全码 (CSC)、卡片验证码 (CVC)、卡片验证值 (CVV)、签名面板代码 (SPC)、信用卡 ID (CCID) 等)ASCII 数字 419 文本
"cc-type"支付工具类型自由格式文本,无换行符Visa文本
"transaction-currency"用户希望交易使用的货币ISO 4217 货币代码 [ISO4217]英镑文本
"transaction-amount"用户希望交易的金额(例如,输入出价或销售价格时)有效的浮点数 401.00 数字
"language"首选语言有效的 BCP 47 语言标签 [BCP47]英语文本
"bday"生日有效的日期字符串 1955-06-08 日期
"bday-day"生日的日期部分介于 1..31 之间的有效整数8 数字
"bday-month"生日的月份部分介于 1..12 之间的有效整数6 数字
"bday-year"生日的年份部分大于零的有效整数1955 数字
"sex"性别认同(例如,女性,Fa'afafine)自由格式文本,无换行符男性文本
"url"与该字段关联的其他字段中公司、人员、地址或联系信息相对应的主页或其他网页有效的 URL 字符串 https://www.w3.org/People/Berners-Lee/网址
"photo"与该字段关联的其他字段中公司、人员、地址或联系信息相对应的照片、图标或其他图像 有效的 URL 字符串 https://www.w3.org/Press/Stock/Berners-Lee/2001-europaeum-eighth.jpg 网址
"tel"完整电话号码,包括国家代码以 U+002B 加号字符 (+) 为前缀的ASCII 数字和 U+0020 空格字符+1 617 253 5702 电话
"tel-country-code"电话号码的国家代码部分以 U+002B 加号字符 (+) 为前缀的ASCII 数字+1 文本
"tel-national"不含国家代码部分的电话号码,如果适用,则应用国家内部前缀ASCII 数字和 U+0020 空格字符617 253 5702 文本
"tel-area-code"电话号码的区号部分,如果适用,则应用国家内部前缀ASCII 数字 617 文本
"tel-local"不含国家代码和区号部分的电话号码ASCII 数字 2535702 文本
"tel-local-prefix"在该组件分为两个组件时,电话号码中跟随区号的组件的第一部分

ASCII 数字 253 文本
"tel-local-suffix"电话号码中跟随区号的部分,当该部分被拆分为两个部分时。ASCII 数字 5702 文本
"tel-extension"电话号码内部分机号码ASCII 数字 1000 文本
"email"电子邮件地址有效的电子邮件地址 [email protected]用户名
"impp"表示即时通讯协议端点的 URL(例如,“aim:goim?screenname=example”或“xmpp:[email protected]”)有效的 URL 字符串 irc://example.org/timbl,isuser网址

这些组与控件的对应关系如下

文本
input 元素,其type 属性处于隐藏状态
input 元素,其type 属性处于文本状态
input 元素,其type 属性处于搜索状态
textarea 元素
select 元素
多行
input 元素,其type 属性处于隐藏状态
textarea 元素
select 元素
密码
input 元素,其type 属性处于隐藏状态
input 元素,其type 属性处于文本状态
input 元素,其type 属性处于搜索状态
input 元素,其type 属性处于密码状态
textarea 元素
select 元素
网址
input 元素,其type 属性处于隐藏状态
input 元素,其type 属性处于文本状态
input 元素,其type 属性处于搜索状态
input 元素,其type 属性处于URL状态
textarea 元素
select 元素
用户名
input 元素,其type 属性处于隐藏状态
input 元素,其type 属性处于文本状态
input 元素,其type 属性处于搜索状态
input 元素,其type 属性处于电子邮件状态
textarea 元素
select 元素
电话
input 元素,其type 属性处于隐藏状态
input 元素,其type 属性处于文本状态
input 元素,其type 属性处于搜索状态
input 元素,其type 属性处于电话状态
textarea 元素
select 元素
数字
input 元素,其type 属性处于隐藏状态
input 元素,其type 属性处于文本状态
input 元素,其type 属性处于搜索状态
input 元素,其type 属性处于数字状态
textarea 元素
select 元素
月份
input 元素,其type 属性处于隐藏状态
input 元素,其type 属性处于文本状态
input 元素,其type 属性处于搜索状态
input 元素,其type 属性处于月份状态
textarea 元素
select 元素
日期
input 元素,其type 属性处于隐藏状态
input 元素,其type 属性处于文本状态
input 元素,其type 属性处于搜索状态
具有 type 属性且处于 日期 状态的 input 元素
textarea 元素
select 元素

地址级别:“address-level1” - “address-level4” 字段用于描述街道地址的区域。不同地区地址级别数量不同。例如,美国使用两个级别(州和城镇),英国根据地址使用一到两个级别(邮政城镇,以及某些情况下区域),而中国可以使用三个级别(省、市、区)。“address-level1” 字段代表最宽泛的行政区域。不同地区的字段顺序也不同;例如,在美国,城镇(级别 2)在州(级别 1)之前;而在日本,县(级别 1)在市(级别 2)之前,市在区(级别 3)之前。鼓励作者提供符合国家规范的表单(根据用户更改的国家/地区相应地隐藏、显示和重新排列字段)。

4.10.18.7.2 处理模型

每个应用了 autocomplete 属性的 input 元素、每个 select 元素以及每个 textarea 元素都具有一个自动填充提示集、一个自动填充范围、一个自动填充字段名称、一个非自动填充凭据类型和一个IDL 公开自动填充值

自动填充字段名称 指定字段中预期的数据的具体类型,例如“street-address” 或 “cc-exp”。

自动填充提示集 标识用户代理要查看的地址或联系信息类型,例如“shipping fax” 或 “billing”。

非自动填充凭据类型 标识一种当用户与字段交互时,用户代理可能会提供的凭据类型,同时提供其他自动填充字段值。如果此值为“webauthn”而不是 null,则选择该类型的凭据将解决挂起的条件 中介 navigator.credentials.get() 请求,而不是自动填充字段。

例如,登录页面可以指示用户代理自动填充保存的密码,或显示一个公钥凭据,该凭据将解决挂起的navigator.credentials.get() 请求。用户可以选择其中一个进行登录。

<input name=password type=password autocomplete="current-password webauthn">

自动填充范围 标识其信息涉及同一主题的一组字段,并且由自动填充提示集以及(如果适用)“section-*” 前缀组成,例如“billing”、“section-parent shipping” 或 “section-child shipping home”。

这些值定义为运行以下算法的结果

  1. 如果元素没有 autocomplete 属性,则跳转到标记为默认的步骤。

  2. tokens在 ASCII 空格处分割属性值的结果。

  3. 如果tokens 为空,则跳转到标记为默认的步骤。

  4. indextokens 中最后一个标记的索引。

  5. fieldtokens 中第index 个标记。

  6. categorymaximum tokens 对设置为给定field确定字段类别的结果。

  7. 如果category 为 null,则跳转到标记为默认的步骤。

  8. 如果tokens 中标记的数量大于maximum tokens,则跳转到标记为默认的步骤。

  9. 如果category 为关闭或自动,但元素的 autocomplete 属性正在使用自动填充锚点外壳,则跳转到标记为默认的步骤。

  10. 如果category 为关闭,则令元素的自动填充字段名称 为字符串“off”,令其自动填充提示集 为空,并令其IDL 公开自动填充值 为字符串“off”。然后,返回。

  11. 如果category 为自动,则令元素的自动填充字段名称 为字符串“on”,令其自动填充提示集 为空,并令其IDL 公开自动填充值 为字符串“on”。然后,返回。

  12. scope tokens 为一个空列表。

  13. hint tokens 为一个空集。

  14. credential type 为 null。

  15. IDL valuefield 具有相同的值。

  16. 如果category 为凭据,并且tokens 中的第index 个标记与“webauthn不区分大小写地匹配,则运行以下子步骤

    1. credential type 设置为“webauthn”。

    2. 如果tokens 中的第index 个标记是第一个条目,则跳过到标记为完成的步骤。

    3. index 减 1。

    4. categorymaximum tokens 对设置为给定tokens 中的第index 个标记的确定字段类别的结果。

    5. 如果category 不是正常且category 不是联系,则跳转到标记为默认的步骤。

    6. 如果index 大于maximum tokens 减 1(即,如果剩余标记的数量大于maximum tokens),则跳转到标记为默认的步骤。

    7. IDL value 设置为tokens 中的第index 个标记、一个 U+0020 空格字符以及IDL value 的先前值的串联。

  17. 如果tokens 中的第index 个标记是第一个条目,则跳过到标记为完成的步骤。

  18. index 减 1。

  19. 如果category 为联系,并且tokens 中的第index 个标记与以下列表中的一个字符串不区分大小写地匹配,则运行以下子步骤

    子步骤是

    1. contact 为上面列表中匹配的字符串。

    2. scope tokens 的开头插入contact

    3. contact 添加到hint tokens

    4. IDL value 设置为contact、一个 U+0020 空格字符以及IDL value 的先前值的串联。

    5. 如果tokens 中的第index 个条目是第一个条目,则跳过到标记为完成的步骤。

    6. index 减 1。

  20. 如果tokens 中的第index 个标记与以下列表中的一个字符串不区分大小写地匹配,则运行以下子步骤

    子步骤是

    1. mode 为上面列表中匹配的字符串。

    2. scope tokens 的开头插入mode

    3. mode 添加到hint tokens

    4. IDL value 设置为mode、一个 U+0020 空格字符以及IDL value 的先前值的串联。

    5. 如果tokens 中的第index 个条目是第一个条目,则跳过到标记为完成的步骤。

    6. index 减 1。

  21. 如果tokens 中的第index 个条目不是第一个条目,则跳转到标记为默认的步骤。

  22. 如果tokens 中的第index 个标记的前八个字符与字符串“section-不区分大小写地匹配,则跳转到标记为默认的步骤。

  23. sectiontokens 中的第index 个标记,转换为 ASCII 小写

  24. scope tokens 的开头插入section

  25. IDL value 设置为section、一个 U+0020 空格字符以及IDL value 的先前值的串联。

  26. 完成:令元素的自动填充提示集hint tokens

  27. 令元素的非自动填充凭据类型credential type

  28. 令元素的自动填充范围scope tokens

  29. 令元素的自动填充字段名称field

  30. 令元素的IDL 公开自动填充值IDL value

  31. 返回。

  32. 默认:令元素的IDL 公开自动填充值 为空字符串,并令其自动填充提示集自动填充范围 为空。

  33. 如果元素的 autocomplete 属性正在使用自动填充锚点外壳,则令元素的自动填充字段名称 为空字符串并返回。

  34. form 为元素的表单所有者(如果有),否则为 null。

  35. 如果 form 不为空,并且 formautocomplete 属性处于 关闭 状态,则将元素的 自动填充字段名称 设置为 "关闭"。

    否则,将元素的 自动填充字段名称 设置为 "开启"。

确定字段的类别,给定 field

  1. 如果 field 与以下表格第一列中给出的任何一个标记在 ASCII 不区分大小写 方面不匹配,则返回对 (null, null)。

    标记最大标记数类别
    "关闭"1 关闭
    "开启"1 自动
    "名称"3 普通
    "尊称前缀"3 普通
    "给定名称"3 普通
    "附加名称"3 普通
    "姓氏"3 普通
    "尊称后缀"3 普通
    "昵称"3 普通
    "组织职位"3 普通
    "用户名"3 普通
    "新密码"3 普通
    "当前密码"3 普通
    "一次性代码"3 普通
    "组织"3 普通
    "街道地址"3 普通
    "地址行1"3 普通
    "地址行2"3 普通
    "地址行3"3 普通
    "地址级别4"3 普通
    "地址级别3"3 普通
    "地址级别2"3 普通
    "地址级别1"3 普通
    "国家"3 普通
    "国家名称"3 普通
    "邮政编码"3 普通
    "信用卡姓名"3 普通
    "信用卡给定名称"3 普通
    "信用卡附加名称"3 普通
    "信用卡姓氏"3 普通
    "信用卡号码"3 普通
    "信用卡有效期"3 普通
    "信用卡有效期月份"3 普通
    "信用卡有效期年份"3 普通
    "信用卡安全码"3 普通
    "信用卡类型"3 普通
    "交易货币"3 普通
    "交易金额"3 普通
    "语言"3 普通
    "生日"3 普通
    "生日日期"3 普通
    "生日月份"3 普通
    "生日年份"3 普通
    "性别"3 普通
    "网址"3 普通
    "照片"3 普通
    "电话"4 联系方式
    "电话国家代码"4 联系方式
    "电话国家区号"4 联系方式
    "电话区号"4 联系方式
    "电话本地号码"4 联系方式
    "电话本地号码前缀"4 联系方式
    "电话本地号码后缀"4 联系方式
    "电话分机号"4 联系方式
    "电子邮件"4 联系方式
    "即时通讯"4 联系方式
    "WebAuthn"5 凭证
  2. 否则,将 最大标记数类别 分别设置为该行第二列和第三列单元格的值。

  3. 返回对 (类别, 最大标记数)。


出于自动填充的目的,控件的数据 取决于控件的类型

输入 元素,其 type 属性处于 电子邮件 状态,并且指定了 multiple 属性
元素的 s
任何其他 输入 元素
一个 文本区域 元素
元素的
一个 选择 元素,其 multiple 属性已指定
选项 元素在 选择 元素的 选项列表 中,并且其 选中状态 设置为 true。
任何其他 选择 元素
选项 元素在 选择 元素的 选项列表 中,并且其 选中状态 设置为 true。

如何处理 自动填充提示集自动填充范围自动填充字段名称 取决于 autocomplete 属性所承担的角色。

当承担 自动填充期望角色 时…

当元素的 自动填充字段名称 为 "关闭" 时,用户代理不应记住 控件的数据,也不应向用户提供以前的值。

此外,当元素的 自动填充字段名称 为 "关闭" 时,值将重置,当 重新激活文档 时。

银行通常不希望 UA 预填充登录信息

<p><label>Account: <input type="text" name="ac" autocomplete="off"></label></p>
<p><label>PIN: <input type="password" name="pin" autocomplete="off"></label></p>

当元素的 自动填充字段名称 *不* 为 "关闭" 时,用户代理可能会存储 控件的数据,并可能向用户提供以前存储的值。

例如,假设用户访问包含以下控件的页面

<select name="country">
 <option>Afghanistan
 <option>Albania
 <option>Algeria
 <option>Andorra
 <option>Angola
 <option>Antigua and Barbuda
 <option>Argentina
 <option>Armenia
 <!-- ... -->
 <option>Yemen
 <option>Zambia
 <option>Zimbabwe
</select>

这可能会呈现如下

A drop-down control with a long alphabetical list of countries.

假设在第一次访问此页面时,用户选择了“赞比亚”。在第二次访问时,用户代理可以在列表顶部复制赞比亚的条目,以便界面改为如下所示

The same drop-down control with the alphabetical list of countries, but with Zambia as an entry at the top.

自动填充字段名称 为 "开启" 时,用户代理应尝试使用启发式方法来确定向用户提供最合适的值,例如,根据元素的 name 值、元素在其 中的位置、表单中存在的其他字段等。

自动填充字段名称 是上面描述的 自动填充字段 之一名称时,用户代理应提供与该字段名称含义匹配的建议,如本节前面表格中所述。 自动填充提示集 应用于在多个可能的建议中进行选择。

例如,如果用户曾经将一个地址输入到使用“shipping”关键字的字段中,并将另一个地址输入到使用“billing”关键字的字段中,则在后续表单中,只有第一个地址会建议用于 自动填充提示集 包含关键字“shipping”的表单控件。但是,对于 自动填充提示集 不包含这两个关键字的与地址相关的表单控件,可能会建议这两个地址。

当承担 自动填充锚点角色 时…

自动填充字段名称不是空字符串时,则用户代理必须表现得好像用户已为给定的控件数据自动填充提示集自动填充范围自动填充字段名称组合指定了该数据。

当用户代理自动填充表单控件时,具有相同表单所有者和相同自动填充范围的元素必须使用与同一人、地址、付款工具和联系方式相关的数据。当用户代理自动填充具有相同表单所有者自动填充范围的"country"和"country-name"字段,并且用户代理具有"country"字段的值时,则"country-name"字段必须使用相同国家/地区的易于理解的名称进行填充。当用户代理一次填充多个字段时,所有具有相同自动填充字段名称表单所有者自动填充范围的字段必须填充相同的值。

假设用户代理知道两个电话号码,+1 555 123 1234 和 +1 555 666 7777。如果用户代理使用值“123”填充autocomplete="shipping tel-local-prefix"的字段,并使用值“7777”填充同一表单中另一个autocomplete="shipping tel-local-suffix"的字段,则不符合规范。根据上述信息,唯一有效的预填充值分别为“123”和“1234”,或“666”和“7777”。

类似地,如果某个表单由于某种原因同时包含"cc-exp"字段和"cc-exp-month"字段,并且用户代理预填充了表单,则前者的月份组件必须与后者匹配。

此要求也与自动填充锚点外壳交互。请考虑以下标记片段

<form>
 <input type=hidden autocomplete="nickname" value="TreePlate">
 <input type=text autocomplete="nickname">
</form>

符合规范的用户代理在文本控件中可以建议的唯一值是“TreePlate”,即隐藏的input元素提供的值。

自动填充范围中的“section-*”标记是不透明的;用户代理不得尝试从这些标记的确切值中推导出含义。

例如,如果用户代理决定它应该为“section-child”提供它知道的用户女儿的地址,并为“section-spouse”提供它知道的用户配偶的地址,则不符合规范。

自动完成功能必须由用户代理实现,其行为就好像用户修改了控件数据一样,并且必须在元素可变时进行(例如,在元素刚刚插入文档中之后,或当用户代理停止解析时)。用户代理必须仅使用用户可能输入的值来预填充控件。

例如,如果select元素仅具有值为“Steve”和“Rebecca”、"Jay"和"Bob"的option元素,并且具有自动填充字段名称"given-name",但用户代理唯一要预填充该字段的值是“Evan”,则用户代理无法预填充该字段。如果以某种方式将select元素设置为值“Evan”,则不符合规范,因为用户无法自己执行此操作。

预填充表单控件的用户代理不得区分位于文档树中的表单控件和已连接的表单控件;也就是说,基于元素的影子根还是Document来决定是否自动填充是不符合规范的。

预填充表单控件的用户代理不得导致该控件出现类型不匹配过长过短下溢溢出步长不匹配。预填充表单控件的用户代理也不得导致该控件出现模式不匹配。在给定控件约束的情况下,用户代理必须尽可能使用上述表格中给出的规范格式。如果无法使用规范格式,则用户代理应使用启发式方法尝试转换值以便可以使用它们。

例如,如果用户代理知道用户的中间名是“Ines”,并尝试预填充如下所示的表单控件

<input name=middle-initial maxlength=1 autocomplete="additional-name">

…那么用户代理可以将“Ines”转换为“I”并以这种方式进行预填充。

一个更复杂的示例是使用月份值。如果用户代理知道用户的生日是 2012 年 7 月 27 日,则它可能会尝试使用略微不同的值预填充以下所有控件,所有这些值都来自此信息

<input name=b type=month autocomplete="bday">
2012-07 由于Month状态仅接受月/年组合,因此会删除日期。(请注意,此示例不符合规范,因为自动填充字段名称bday不允许与Month状态一起使用。)
<select name=c autocomplete="bday">
 <option>Jan
 <option>Feb
 ...
 <option>Jul
 <option>Aug
 ...
</select>
七月用户代理从列出的选项中选择月份,方法是注意到有 12 个选项并选择第 7 个,或者识别其中一个字符串(三个字符“Jul”后跟换行符和空格)与用户代理支持的语言之一中月份(七月)的名称非常接近,或者通过其他类似机制。
<input name=a type=number min=1 max=12 autocomplete="bday-month">
7 用户代理将“七月”转换为 1..12 范围内的月份编号,就像该字段一样。
<input name=a type=number min=0 max=11 autocomplete="bday-month">
6 用户代理将“七月”转换为 0..11 范围内的月份编号,就像该字段一样。
<input name=a type=number min=1 max=11 autocomplete="bday-month">
用户代理不填充该字段,因为它无法很好地猜测表单期望的内容。

用户代理可以允许用户覆盖元素的自动填充字段名称,例如,将其从"off"更改为"on",以允许记住和预填充值,即使页面作者反对,或者始终"off",永远不记住值。

更具体地说,用户代理可能会特别考虑替换以下表格第一列中给出的描述匹配的表单控件的自动填充字段名称,当它们的自动填充字段名称为"on"或"off"时,替换为该行第二单元格中给出的值。如果使用此表格,则必须按树形顺序进行替换,因为除第一行以外的所有行都引用了前面元素的自动填充字段名称。当以下描述提到表单控件在其他控件之前或之后时,指的是共享相同表单所有者列出元素列表中的位置。

表单控件新的自动填充字段名称
input元素,其type属性处于Text状态,并且后面跟着一个input元素,其type属性处于Password状态"username"
input元素,其type属性处于Password状态,并且前面有input元素,其自动填充字段名称为"username""current-password"
input元素,其type属性处于Password状态,并且前面有input元素,其自动填充字段名称为"current-password""new-password"

一个input元素,其type属性处于Password状态,并且前面有一个input元素,其自动填充字段名称为“new-passwordnew-password

在获取时,autocomplete IDL 属性必须返回元素的IDL 公开自动填充值,在设置时,必须反映同名内容属性。

4.10.19 文本控件选择的 API

inputtextarea元素定义了几个用于处理其选择的属性和方法。它们的共享算法在此定义。

element.select()

选择文本控件中的所有内容。

element.selectionStart [ = value ]

返回选择开始处的偏移量。

可以设置,以更改选择的开始位置。

element.selectionEnd [ = value ]

返回选择结束处的偏移量。

可以设置,以更改选择的结束位置。

element.selectionDirection [ = value ]

返回当前的选择方向。

可以设置,以更改选择的方向。

可能的值为“forward”、“backward”和“none”。

element.setSelectionRange(start, end [, direction])

HTMLInputElement/setSelectionRange

所有当前引擎都支持。

Firefox1+Safari3+Chrome1+
Opera8+Edge79+
Edge (Legacy)12+Internet Explorer9+
Firefox Android?Safari iOS1+Chrome Android?WebView Android?Samsung Internet?Opera Android10.1+

将选择更改为覆盖给定方向中的给定子字符串。如果省略方向,则将其重置为平台默认值(无或向前)。

element.setRangeText(replacement [, start, end [, selectionMode ] ])

HTMLInputElement/setRangeText

所有当前引擎都支持。

Firefox27+Safari7+Chrome24+
Opera?Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

用新文本替换一段文本。如果未提供startend参数,则假定范围为选择。

最后一个参数确定替换文本后如何设置选择。可能的值为

select
选择新插入的文本。
start
将选择移动到插入文本之前。
end
将选择移动到选中文本之后。
preserve
尝试保留选择。这是默认设置。

所有这些 API 适用的input元素,以及所有textarea元素,始终具有选择文本输入光标位置(即使对于未呈现的元素也是如此),以控件代码单元相关值中的偏移量来衡量。初始状态必须包括控件开头处的文本输入光标

对于input元素,这些 API 必须对元素的进行操作。对于textarea元素,这些 API 必须对元素的API 值进行操作。在下述算法中,我们将正在操作的值字符串称为相关值

对于textarea元素,使用API 值而不是原始值意味着 U+000D (CR) 字符会被规范化。例如,

<textarea id="demo"></textarea>
<script>
 demo.value = "A\r\nB";
 demo.setRangeText("replaced", 0, 2);
 assert(demo.value === "replacedB");
</script>

如果我们对“A\r\nB”的原始值进行操作,那么我们将替换字符“A\r”,最终得到“replaced\nB”的结果。但由于我们使用了“A\nB”的API 值,因此我们替换了字符“A\n”,得到“replacedB”。

没有可见渲染的字符,例如 U+200D 零宽连接符,仍然算作字符。因此,例如,选择可以只包含一个不可见的字符,并且文本插入光标可以放置在该字符的一侧或另一侧。

每当这些 API 适用的元素的相关值发生变化时,请运行以下步骤

  1. 如果元素具有选择

    1. 如果选择的开始位置现在超过了相关值的末尾,则将其设置为相关值的末尾。

    2. 如果选择的结束位置现在超过了相关值的末尾,则将其设置为相关值的末尾。

    3. 如果用户代理不支持空选择,并且选择开始和结束位置现在都指向相关值的末尾,则改为将元素的文本输入光标位置设置为相关值的末尾,并删除任何选择。

  2. 否则,元素必须具有文本输入光标位置。如果它现在超过了相关值的末尾,则将其设置为相关值的末尾。

在某些相关值发生变化的情况下,规范的其他部分也将修改文本输入光标位置,而不仅仅是上述钳位步骤。例如,请参阅value设置器(用于textarea)。

在可能的情况下,用于更改inputtextarea元素中文本选择的用户界面功能必须使用设置选择范围算法来实现,以便例如,所有相同的事件都触发。

inputtextarea元素的选择具有选择方向,该方向为“forward”、“backward”或“none”。选择方向的确切含义取决于平台。此方向在用户操作选择时设置。如果平台支持该方向,则初始选择方向必须为“none”,否则为“forward”。

要将元素的选择方向设置为给定方向,请将元素的选择方向更新为给定方向,除非方向为“none”并且平台不支持该方向;在这种情况下,请将元素的选择方向更新为“forward”。

在 Windows 上,方向指示插入符号相对于选择的位置:“forward”选择将插入符号置于选择的末尾,“backward”选择将插入符号置于选择的开头。Windows 没有“none”方向。

在 Mac 上,方向指示用户使用 Shift 键修饰符和方向键调整选择大小时受影响的选择的哪一端:“forward”方向表示选择末尾被修改,“backward”方向表示选择的开头被修改。“none”方向是 Mac 上的默认方向,它表示尚未选择任何特定方向。用户在第一次调整选择时会隐式设置方向,具体取决于使用了哪个方向键。

HTMLInputElement/select

所有当前引擎都支持。

Firefox1+Safari1+Chrome1+
Opera12.1+Edge79+
Edge (旧版)12+Internet Explorer5.5+
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android12.1+

HTMLInputElement/select

调用时,select()方法必须运行以下步骤

  1. 如果此元素是input元素,并且select()不适用于此元素或相应的控件没有可选文本,则返回。

    例如,在用户代理中,<input type=color>呈现为带选取器的颜色井,而不是接受十六进制颜色代码的文本控件,则没有可选文本,因此会忽略对该方法的调用。

  2. 设置选择范围,范围为 0 到无穷大。

selectionStart属性的 getter 必须运行以下步骤

  1. 如果此元素是input元素,并且selectionStart不适用于此元素,则返回 null。

  2. 如果没有选择,则返回代码单元相关值中到紧跟文本输入光标的字符的偏移量。

  3. 返回在代码单元中,紧随选择开始位置的字符的偏移量。相关值

selectionStart 属性的设置器必须执行以下步骤

  1. 如果此元素是input 元素,并且selectionStart 不适用于此元素,则抛出一个"InvalidStateError" DOMException

  2. end 为此元素的selectionEnd 属性的值。

  3. 如果end 小于给定值,则将end 设置为给定值。

  4. 设置选择范围,使用给定值、end 和此元素的selectionDirection 属性的值。

selectionEnd 属性的获取器必须执行以下步骤

  1. 如果此元素是input 元素,并且selectionEnd 不适用于此元素,则返回 null。

  2. 如果没有选择,则返回在相关值中,紧随文本输入光标的字符的代码单元偏移量。

  3. 返回在相关值中,紧随选择结束位置的字符的代码单元偏移量。

selectionEnd 属性的设置器必须执行以下步骤

  1. 如果此元素是input 元素,并且selectionEnd 不适用于此元素,则抛出一个"InvalidStateError" DOMException

  2. 设置选择范围,使用此元素的selectionStart 属性的值、给定值和此元素的selectionDirection 属性的值。

selectionDirection 属性的获取器必须执行以下步骤

  1. 如果此元素是input 元素,并且selectionDirection 不适用于此元素,则返回 null。

  2. 返回此元素的选择方向

selectionDirection 属性的设置器必须执行以下步骤

  1. 如果此元素是input 元素,并且selectionDirection 不适用于此元素,则抛出一个"InvalidStateError" DOMException

  2. 设置选择范围,使用此元素的selectionStart 属性的值、此元素的selectionEnd 属性的值和给定值。

setSelectionRange(start, end, direction) 方法在调用时,必须执行以下步骤

  1. 如果此元素是input 元素,并且setSelectionRange() 不适用于此元素,则抛出一个"InvalidStateError" DOMException

  2. 设置选择范围,使用startenddirection

要使用整数或 null 的start、整数或 null 或特殊值 infinity 的end 以及可选的字符串direction 设置选择范围,请执行以下步骤

  1. 如果start 为 null,则令start 为零。

  2. 如果end 为 null,则令end 为零。

  3. 将文本控件的选择设置为相关值中的一系列代码单元,从第start个位置(逻辑顺序)的代码单元开始,到第(end-1)个位置的代码单元结束。大于文本控件相关值长度(包括特殊值 infinity)的参数必须视为指向文本控件的末尾。如果end 小于或等于start,则选择开始和选择结束都必须放置在偏移量为end的字符之前。在没有空选择概念的 UA 中,这必须将光标设置为偏移量为end的字符之前。

  4. 如果direction 与“backward”或“forward”都不相同,或者如果没有给出direction 参数,则将direction 设置为“none”。

  5. 设置文本控件的选择方向direction

  6. 如果前面的步骤导致文本控件的选择被修改(范围或方向),则给定元素的用户交互任务源排队一个元素任务,以触发名为select 的事件,该事件在元素上触发,其bubbles 属性初始化为 true。

setRangeText(replacement, start, end, selectMode) 方法在调用时,必须执行以下步骤

  1. 如果此元素是input 元素,并且setRangeText() 不适用于此元素,则抛出一个"InvalidStateError" DOMException

  2. 将此元素的脏值标志设置为 true。

  3. 如果该方法只有一个参数,则令startend 分别具有selectionStart 属性和selectionEnd 属性的值。

    否则,令startend 分别具有第二个和第三个参数的值。

  4. 如果start 大于end,则抛出一个"IndexSizeError" DOMException

  5. 如果start 大于文本控件相关值的长度,则将其设置为文本控件相关值的长度。

  6. 如果end 大于文本控件相关值的长度,则将其设置为文本控件相关值的长度。

  7. selection startselectionStart 属性的当前值。

  8. selection endselectionEnd 属性的当前值。

  9. 如果start 小于end,则删除元素相关值中的一系列代码单元,从第start个位置的代码单元开始,到第(end-1)个位置的代码单元结束。

  10. 将第一个参数的值插入到文本控件相关值的文本中,紧靠在第start代码单元之前。

  11. 新长度为第一个参数值的长度

  12. 新结束位置开始位置新长度的和。

  13. 从以下列表中运行相应的子步骤

    如果第四个参数的值为"select"

    选择开始位置开始位置

    选择结束位置新结束位置

    如果第四个参数的值为"start"

    选择开始位置选择结束位置都为开始位置

    如果第四个参数的值为"end"

    选择开始位置选择结束位置都为新结束位置

    如果第四个参数的值为"preserve"
    如果该方法只有一个参数
    1. 旧长度结束位置减去开始位置

    2. 增量新长度减去旧长度

    3. 如果选择开始位置大于结束位置,则将其增加增量。(如果增量为负数,即新文本比旧文本短,则这将减少选择开始位置的值。)

      否则:如果选择开始位置大于开始位置,则将其设置为开始位置。(如果选择开始位置在被替换文本的中间,则此操作会将其捕捉到新文本的开头。)

    4. 如果选择结束位置大于结束位置,则以相同的方式将其增加增量

      否则:如果选择结束位置大于开始位置,则将其设置为新结束位置。(如果选择结束位置在被替换文本的中间,则此操作会将其捕捉到新文本的结尾。)

  14. 使用选择开始位置选择结束位置设置选择范围

setRangeText() 方法使用以下枚举

enum SelectionMode {
  "select",
  "start",
  "end",
  "preserve" // default
};

要获取当前选定的文本,以下 JavaScript 代码就足够了

var selectionText = control.value.substring(control.selectionStart, control.selectionEnd);

…其中控件输入文本区域元素。

要在文本控件的开头添加一些文本,同时保持文本选择,必须保留这三个属性

var oldStart = control.selectionStart;
var oldEnd = control.selectionEnd;
var oldDirection = control.selectionDirection;
var prefix = "http://";
control.value = prefix + control.value;
control.setSelectionRange(oldStart + prefix.length, oldEnd + prefix.length, oldDirection);

…其中控件输入文本区域元素。

4.10.20 约束条件

4.10.20.1 定义

一个可提交元素是一个约束验证候选对象,除非某个条件禁止该元素进行约束验证。(例如,如果一个元素具有数据列表元素祖先,则它被禁止进行约束验证。)

一个元素可以定义一个自定义有效性错误消息。最初,一个元素必须将其自定义有效性错误消息设置为空字符串。当其值不是空字符串时,该元素存在自定义错误。可以使用setCustomValidity()方法设置它,除了与表单关联的自定义元素与表单关联的自定义元素可以通过其ElementInternals对象的setValidity()方法设置自定义有效性错误消息。用户代理应在提醒用户控件存在问题时使用自定义有效性错误消息

一个元素可以通过多种方式进行约束。以下是表单控件可能处于的有效性状态列表,这些状态使控件对于约束验证而言无效。(以下定义是非规范性的;本规范的其他部分更精确地定义了每种状态何时适用或不适用。)

存在缺失值

当一个控件没有但具有required属性(输入 required文本区域 required);或者,对于选择元素和单选按钮组中的控件,规则更加复杂,如各自章节中所述。

setValidity()方法为与表单关联的自定义元素valueMissing标志设置为true时。

存在类型不匹配

当允许任意用户输入的控件具有,但该值语法不正确(电子邮件URL)。

setValidity()方法为与表单关联的自定义元素typeMismatch标志设置为true时。

存在模式不匹配

当一个控件的不满足pattern属性。

setValidity()方法为与表单关联的自定义元素patternMismatch标志设置为true时。

存在长度过长

当一个控件的对于表单控件maxlength属性输入 maxlength文本区域 maxlength)而言过长。

setValidity()方法为与表单关联的自定义元素tooLong标志设置为true时。

存在长度过短

当一个控件的对于表单控件minlength属性输入 minlength文本区域 minlength)而言过短。

setValidity()方法为与表单关联的自定义元素tooShort标志设置为true时。

存在下溢

当一个控件的不是空字符串,并且对于min属性而言过小。

setValidity()方法为与表单关联的自定义元素rangeUnderflow标志设置为true时。

存在上溢

当一个控件的不是空字符串,并且对于max属性而言过大。

setValidity()方法为与表单关联的自定义元素rangeOverflow标志设置为true时。

存在步长不匹配

当一个控件的不符合step属性给出的规则。

setValidity()方法为与表单关联的自定义元素stepMismatch标志设置为true时。

存在无效输入

当一个控件的输入不完整,并且用户代理认为用户不应该能够以其当前状态提交表单。

setValidity()方法为与表单关联的自定义元素badInput标志设置为true时。

存在自定义错误

当一个控件的自定义有效性错误消息(由元素的setCustomValidity()方法或ElementInternalssetValidity()方法设置)不是空字符串。

即使元素已禁用,元素仍然可能处于这些状态;因此,即使在提交过程中验证表单不会向用户指示问题,这些状态也可以在DOM中表示。

如果一个元素没有处于上述任何有效性状态,则它满足其约束条件

4.10.20.2 约束验证

当用户代理需要静态验证表单元素表单的约束条件时,它必须运行以下步骤,这些步骤将返回肯定结果(表单中的所有控件均有效)或否定结果(存在无效控件),以及一个(可能为空)的无效元素列表,并且没有脚本声明对此负责

  1. 控件为所有可提交元素的列表,其表单所有者表单,并按照树的顺序排列。

  2. 无效控件为一个最初为空的元素列表。

  3. 对于 controls 中的每个元素 field,按照 树的顺序

    1. 如果 field 不是 约束验证的候选对象,则继续处理下一个元素。

    2. 否则,如果 field 满足其约束条件,则继续处理下一个元素。

    3. 否则,将 field 添加到 invalid controls 中。

  4. 如果 invalid controls 为空,则返回肯定的结果。

  5. unhandled invalid controls 为一个最初为空的元素列表。

  6. 对于 invalid controls 中的每个元素 field(如果有),按照 树的顺序

    1. notCanceled 为在 field触发名为 invalid 的事件的结果,其中 cancelable 属性初始化为 true。

    2. 如果 notCanceled 为 true,则将 field 添加到 unhandled invalid controls 中。

  7. 返回带有 unhandled invalid controls 列表中元素列表的否定结果。

如果用户代理要交互式地验证 表单 元素 form 的约束条件,则用户代理必须运行以下步骤

  1. 静态验证 form 的约束条件,并令 unhandled invalid controls 为如果结果为否定则返回的元素列表。

  2. 如果结果为肯定,则返回该结果。

  3. 向用户报告 unhandled invalid controls 中给出的至少一个元素的约束条件问题。

  4. 返回否定的结果。

4.10.20.3 约束验证 API
element.willValidate

HTMLObjectElement/willValidate

所有当前引擎都支持。

Firefox4+Safari5+Chrome4+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS4+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

如果在提交表单时将验证元素,则返回 true;否则返回 false。

element.setCustomValidity(message)

HTMLObjectElement/setCustomValidity

所有当前引擎都支持。

Firefox4+Safari5.1+Chrome10+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

HTMLSelectElement/setCustomValidity

所有当前引擎都支持。

Firefox4+Safari5+Chrome4+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS4+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

设置自定义错误,以便元素无法验证。给定的消息是在向用户报告问题时向用户显示的消息。

如果参数为空字符串,则清除自定义错误。

element.validity.valueMissing

ValidityState/valueMissing

所有当前引擎都支持。

Firefox4+Safari5+Chrome4+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS5+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

如果元素没有值但却是必填字段,则返回 true;否则返回 false。

element.validity.typeMismatch

如果元素的值语法不正确,则返回 true;否则返回 false。

element.validity.patternMismatch

如果元素的值与提供的模式不匹配,则返回 true;否则返回 false。

element.validity.tooLong

ValidityState/tooLong

所有当前引擎都支持。

Firefox4+Safari5+Chrome4+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android64+Safari iOS5+Chrome Android?WebView Android4+Samsung Internet?Opera Android12.1+

如果元素的值长于提供的最大长度,则返回 true;否则返回 false。

element.validity.tooShort

ValidityState/tooShort

所有当前引擎都支持。

Firefox51+Safari10+Chrome40+
Opera?Edge79+
Edge (Legacy)17+Internet ExplorerNo
Firefox Android64+Safari iOS?Chrome Android?WebView Android67+Samsung Internet?Opera Android?

如果元素的值(如果它不是空字符串)短于提供的最小长度,则返回 true;否则返回 false。

element.validity.rangeUnderflow

如果元素的值低于提供的最小值,则返回 true;否则返回 false。

element.validity.rangeOverflow

如果元素的值高于提供的最大值,则返回 true;否则返回 false。

element.validity.stepMismatch

如果元素的值不符合 step 属性给出的规则,则返回 true;否则返回 false。

element.validity.badInput

ValidityState/badInput

所有当前引擎都支持。

Firefox29+Safari7+Chrome25+
Opera?Edge79+
Edge (Legacy)12+Internet ExplorerNo
Firefox Android64+Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

如果用户在用户界面中提供了用户代理无法转换为值的输入,则返回 true;否则返回 false。

element.validity.customError

如果元素有自定义错误,则返回 true;否则返回 false。

element.validity.valid

如果元素的值没有有效性问题,则返回 true;否则返回 false。

valid = element.checkValidity()

HTMLInputElement/checkValidity

所有当前引擎都支持。

Firefox4+Safari5+Chrome4+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS4+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

HTMLObjectElement/checkValidity

所有当前引擎都支持。

Firefox4+Safari5.1+Chrome10+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

HTMLSelectElement/checkValidity

所有当前引擎都支持。

Firefox4+Safari5+Chrome4+
Opera9+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS4+Chrome Android?WebView Android37+Samsung Internet?Opera Android10.1+

如果元素的值没有有效性问题,则返回 true;否则返回 false。在后一种情况下,在元素上触发 invalid 事件。

valid = element.reportValidity()

HTMLFormElement/reportValidity

所有当前引擎都支持。

Firefox49+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)17+Internet ExplorerNo
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

HTMLInputElement/reportValidity

所有当前引擎都支持。

Firefox49+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)17+Internet ExplorerNo
Firefox Android64+Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

如果元素的值没有有效性问题,则返回 true;否则,返回 false,在元素上触发 invalid 事件,并且(如果事件未被取消)向用户报告问题。

element.validationMessage

HTMLObjectElement/validationMessage

所有当前引擎都支持。

Firefox4+Safari5.1+Chrome10+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

返回如果要检查元素的有效性,则将向用户显示的错误消息。

willValidate 属性的 getter 必须返回 true,如果此元素是 约束验证的候选对象,否则返回 false(即,如果任何条件 阻止它进行约束验证,则返回 false)。

ElementInternals/willValidate

所有当前引擎都支持。

Firefox98+Safari16.4+Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

willValidate 属性的 ElementInternals 接口,在获取时,如果 目标元素 不是 表单关联的自定义元素,则必须抛出一个 "NotSupportedError" DOMException。否则,如果 目标元素约束验证的候选对象,则必须返回 true,否则返回 false。

HTMLInputElement/setCustomValidity

所有当前引擎都支持。

Firefox4+Safari5+Chrome4+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS4+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

setCustomValidity(error) 方法的步骤如下:

  1. error 设置为给定 error规范化换行符 的结果。

  2. 自定义有效性错误消息 设置为 error

在以下示例中,脚本在每次编辑表单控件的值时都会检查该值,并且只要该值不是有效值,就会使用 setCustomValidity() 方法设置适当的消息。

<label>Feeling: <input name=f type="text" oninput="check(this)"></label>
<script>
 function check(input) {
   if (input.value == "good" ||
       input.value == "fine" ||
       input.value == "tired") {
     input.setCustomValidity('"' + input.value + '" is not a feeling.');
   } else {
     // input is fine -- reset the error message
     input.setCustomValidity('');
   }
 }
</script>

HTMLObjectElement/validity

所有当前引擎都支持。

Firefox4+Safari5.1+Chrome10+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS?Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

validity 属性的 getter 必须返回一个 ValidityState 对象,该对象表示此元素的 有效性状态。此对象是 动态的

ElementInternals/validity

所有当前引擎都支持。

Firefox98+Safari16.4+Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

ElementInternals 接口的 validity 属性在获取时,如果 目标元素 不是 与表单关联的自定义元素,则必须抛出一个 "NotSupportedError" DOMException。否则,它必须返回一个 ValidityState 对象,该对象表示 目标元素有效性状态。此对象是 动态的

[Exposed=Window]
interface ValidityState {
  readonly attribute boolean valueMissing;
  readonly attribute boolean typeMismatch;
  readonly attribute boolean patternMismatch;
  readonly attribute boolean tooLong;
  readonly attribute boolean tooShort;
  readonly attribute boolean rangeUnderflow;
  readonly attribute boolean rangeOverflow;
  readonly attribute boolean stepMismatch;
  readonly attribute boolean badInput;
  readonly attribute boolean customError;
  readonly attribute boolean valid;
};

ValidityState 对象具有以下属性。在获取时,如果以下列表中给定的相应条件为真,则必须返回 true,否则返回 false。

valueMissing

该控件 缺少值

typeMismatch

ValidityState/typeMismatch

所有当前引擎都支持。

Firefox4+Safari5+Chrome4+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS5+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

该控件 类型不匹配

patternMismatch

ValidityState/patternMismatch

所有当前引擎都支持。

Firefox4+Safari5+Chrome4+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS5+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

该控件 与模式不匹配

tooLong

该控件 过长

tooShort

该控件 过短

rangeUnderflow

ValidityState/rangeUnderflow

所有当前引擎都支持。

Firefox4+Safari5+Chrome4+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS5+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

该控件 值小于范围下限

rangeOverflow

ValidityState/rangeOverflow

所有当前引擎都支持。

Firefox4+Safari5+Chrome4+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS5+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

该控件 值大于范围上限

stepMismatch

ValidityState/stepMismatch

所有当前引擎都支持。

Firefox4+Safari5+Chrome4+
Opera12.1+Edge79+
Edge (Legacy)12+Internet Explorer10+
Firefox Android?Safari iOS5+Chrome Android?WebView Android37+Samsung Internet?Opera Android12.1+

该控件 步长不匹配

badInput

该控件 输入无效

customError

该控件 存在自定义错误

valid

以上所有条件都不成立。

元素 element检查有效性步骤 如下:

  1. 如果 element约束验证的候选对象不满足其约束条件,则

    1. 触发名为 invalid 的事件,该事件在 element 上触发,其 cancelable 属性初始化为 true(尽管取消没有任何效果)。

    2. 返回 false。

  2. 返回 true。

当调用 checkValidity() 方法时,必须在此元素上运行 检查有效性步骤

ElementInternals/checkValidity

所有当前引擎都支持。

Firefox98+Safari16.4+Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

ElementInternals 接口的 checkValidity() 方法必须运行以下步骤

  1. element 为此 ElementInternals目标元素

  2. 如果 element 不是 与表单关联的自定义元素,则抛出一个 "NotSupportedError" DOMException

  3. element 上运行 检查有效性步骤

元素 element报告有效性步骤 如下:

  1. 如果 element约束验证的候选对象不满足其约束条件,则

    1. report触发名为 invalid 的事件的结果,该事件在 element 上触发,其 cancelable 属性初始化为 true。

    2. 如果 report 为 true,则向用户报告此元素约束条件的问题。在向用户报告约束条件问题时,用户代理可能会为 element 运行 聚焦步骤,并且可能会更改文档的滚动位置,或者执行其他一些使 element 引起用户注意的操作。如果 element 同时存在多个问题,则用户代理可能会报告多个约束违规。

    3. 返回 false。

  2. 返回 true。

当调用 reportValidity() 方法时,必须在此元素上运行 报告有效性步骤

ElementInternals/reportValidity

所有当前引擎都支持。

Firefox98+Safari16.4+Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

ElementInternals 接口的 reportValidity() 方法必须运行以下步骤

  1. element 为此 ElementInternals目标元素

  2. 如果 element 不是 与表单关联的自定义元素,则抛出一个 "NotSupportedError" DOMException

  3. element 上运行 报告有效性步骤

validationMessage 属性的 getter 必须运行以下步骤

  1. 如果此元素不是 约束验证的候选对象,或者如果此元素 满足其约束条件,则返回空字符串。

  2. 返回用户代理在这种情况(如果这是唯一一个存在有效性约束问题的表单控件)下向用户显示的适当本地化消息。如果用户代理在这种情况下实际上不会显示文本消息(例如,它会显示图形提示),则返回一个适当本地化的消息,该消息表达了控件不满足的(一个或多个)有效性约束。如果元素是 约束验证的候选对象 并且 存在自定义错误,则 自定义有效性错误消息 应出现在返回值中。

4.10.20.4 安全性

服务器不应依赖于客户端验证。客户端验证可以被恶意用户有意绕过,也可以被使用旧版用户代理或未实现这些功能的自动化工具的用户无意中绕过。约束验证功能仅用于改善用户体验,而不是提供任何类型的安全机制。

4.10.21 表单提交

4.10.21.1 简介

本节是非规范性的。

当提交表单时,表单中的数据将转换为 enctype 指定的结构,然后使用给定的 method 发送到 action 指定的目标。

例如,以下表单

<form action="/find.cgi" method=get>
 <input type=text name=t>
 <input type=search name=q>
 <input type=submit>
</form>

如果用户在第一个字段中输入“cats”,在第二个字段中输入“fur”,然后点击提交按钮,则用户代理将加载 /find.cgi?t=cats&q=fur

另一方面,考虑以下表单

<form action="/find.cgi" method=post enctype="multipart/form-data">
 <input type=text name=t>
 <input type=search name=q>
 <input type=submit>
</form>

给定相同的用户输入,提交结果会有所不同:用户代理改为对给定的 URL 执行 HTTP POST 请求,其实体主体类似于以下文本

------kYFrd4jNJEgCervE
Content-Disposition: form-data; name="t"

cats
------kYFrd4jNJEgCervE
Content-Disposition: form-data; name="q"

fur
------kYFrd4jNJEgCervE--
4.10.21.2 隐式提交

form 元素的 默认按钮树序 中第一个 表单所有者 为该 form 元素的 提交按钮

如果用户代理支持让用户隐式提交表单(例如,在某些平台上,当文本控件获得焦点时按下“Enter”键会隐式提交表单),那么对于表单,其默认按钮具有激活行为且未禁用,这样做必须导致用户代理在该默认按钮触发一个click事件

网络上有一些页面只有在存在隐式提交表单的方式时才能使用,因此强烈建议用户代理支持此功能。

如果表单没有提交按钮,则隐式提交机制必须执行以下步骤

  1. 如果表单有多个阻止隐式提交的字段,则返回。

  2. 提交来自表单元素本身的表单元素,并将userInvolvement设置为"activation"。

出于上一段的目的,如果一个元素是表单元素的阻止隐式提交的字段,则它必须是输入元素,其表单所有者为该表单元素,且其type属性处于以下状态之一:文本搜索电话URL电子邮件密码日期月份星期时间本地日期和时间数字

4.10.21.3 表单提交算法

每个表单元素都有一个构建条目列表布尔值,初始值为false。

每个表单元素都有一个触发提交事件布尔值,初始值为false。

提交一个来自元素submitter(通常是按钮)的表单元素form,给定一个可选的布尔值submit()方法提交(默认为false)和一个可选的用户导航参与userInvolvement(默认为"none")

  1. 如果form无法导航,则返回。

  2. 如果form构建条目列表为true,则返回。

  3. 表单文档form节点文档

  4. 如果表单文档活动沙箱标志集已设置其沙箱表单浏览上下文标志,则返回。

  5. 如果submit()方法提交为false,则

    1. 如果form触发提交事件为true,则返回。

    2. form触发提交事件设置为true。

    3. 对于可提交元素列表中每个表单所有者form的元素field,将field用户有效性设置为true。

    4. 如果submitter元素的no-validate状态为false,则交互式验证form的约束并检查结果。如果结果为负(即,约束验证得出结论,存在无效字段,并可能已告知用户此情况),则

      1. form触发提交事件设置为false。

      2. 返回。

    5. 如果submitterform,则令submitterButton为null。否则,令submitterButtonsubmitter

    6. shouldContinue为使用SubmitEventform触发名为submit的事件的结果,其中submitter属性初始化为submitterButtonbubbles属性初始化为true,并且cancelable属性初始化为true。

    7. form触发提交事件设置为false。

    8. 如果shouldContinue为false,则返回。

    9. 如果form无法导航,则返回。

      再次运行无法导航,因为调度submit事件可能会改变结果。

  6. encoding为表单选择编码的结果。

  7. 条目列表为使用formsubmitterencoding构建条目列表的结果。

  8. 断言条目列表不为null。

  9. 如果form无法导航,则返回。

    再次运行无法导航,因为在构建条目列表中调度formdata事件可能会改变结果。

  10. methodsubmitter元素的方法

  11. 如果methoddialog,则

    1. 如果form没有祖先dialog元素,则返回。

    2. subjectform最近的祖先dialog元素。

    3. result为null。

    4. 如果submitterinput元素,其type属性处于图像按钮状态,则

      1. 令(xy)为选定的坐标

      2. result设置为x、","和y的连接。

    5. 否则,如果submitter具有,则将result设置为该

    6. 使用result关闭对话框subject

    7. 返回。

  12. actionsubmitter元素的操作

  13. 如果action为空字符串,则令action表单文档URL

  14. 已解析的操作为给定action相对于submitter节点文档编码解析URL的结果。

  15. 如果已解析的操作失败,则返回。

  16. scheme已解析的操作方案

  17. enctypesubmitter元素的enctype

  18. formTarget为null。

  19. 如果submitter元素是提交按钮并且它具有formtarget属性,则将formTarget设置为formtarget属性值。

  20. target为给定submitter表单所有者formTarget获取元素的目标的结果。

  21. noopener为使用formtarget获取元素的noopener的结果。

  22. targetNavigable为给定targetform节点可导航noopener选择可导航的规则应用的第一个返回值。

  23. 如果targetNavigable为null,则返回。

  24. historyHandling为"auto"。

  25. 如果表单文档等于targetNavigable活动文档,并且表单文档尚未完全加载,则将historyHandling设置为"replace"。

  26. 根据表格每行第一单元格给出的 scheme 选择合适的行。然后,根据每列第一单元格给出的 method 选择该行中的合适单元格。最后,跳转到该单元格中指定的步骤,这些步骤在表格下方定义。

    GET POST
    http 修改操作 URL 作为实体主体提交
    https 修改操作 URL 作为实体主体提交
    ftp 获取操作 URL 获取操作 URL
    javascript 获取操作 URL 获取操作 URL
    data 修改操作 URL 获取操作 URL
    mailto 带头部的邮件 作为邮件正文

    如果 scheme 不是表格中列出的内容,则此规范未定义行为。在没有其他规范定义此行为的情况下,用户代理应以类似于本规范中针对类似方案定义的方式进行操作。

    每个 form 元素都有一个 计划导航,它要么为空,要么是一个 任务;当 form 首次创建时,其 计划导航 必须设置为 null。在下述行为中,当用户代理需要 计划导航 到给定可选 POST 资源-或-null postResource(默认为 null)的 URL url 时,它必须运行以下步骤

    1. referrerPolicy 为空字符串。

    2. 如果 form 元素的 链接类型 包含 noreferrer 关键字,则将 referrerPolicy 设置为 "no-referrer"。

    3. 如果 form 具有非 null 的 计划导航,则将其从其 任务队列 中移除。

    4. 在 DOM 操作任务源上为 form 元素排队一个元素任务,并执行以下步骤

      1. form计划导航 设置为 null。

      2. 使用 form 元素的 节点文档,将 targetNavigable 导航url,其中 historyHandling 设置为 historyHandlinguserInvolvement 设置为 userInvolvementreferrerPolicy 设置为 referrerPolicydocumentResource 设置为 postResource,以及 formDataEntryList 设置为 条目列表

    5. form计划导航 设置为刚刚排队的 任务

    行为如下

    修改操作 URL

    pairs 为使用 条目列表 转换为名称-值对列表 的结果。

    query 为使用 pairsencoding 运行 application/x-www-form-urlencoded 序列化器 的结果。

    解析后的操作查询 组件设置为 query

    计划导航解析后的操作

    作为实体主体提交

    断言methodPOST

    根据 enctype 切换

    application/x-www-form-urlencoded

    pairs 为使用 条目列表 转换为名称-值对列表 的结果。

    body 为使用 pairsencoding 运行 application/x-www-form-urlencoded 序列化器 的结果。

    body 设置为 编码 body 的结果。

    mimeType 为 `application/x-www-form-urlencoded`。

    multipart/form-data

    body 为使用 条目列表encoding 运行 multipart/form-data 编码算法 的结果。

    mimeType 为 "multipart/form-data; boundary=" 与由 multipart/form-data 编码算法 生成的 multipart/form-data 边界字符串 的连接的 同构编码

    text/plain

    pairs 为使用 条目列表 转换为名称-值对列表 的结果。

    body 为使用 pairs 运行 text/plain 编码算法 的结果。

    body 设置为使用 encoding 编码 body 的结果。

    mimeType 为 `text/plain`。

    计划导航解析后的操作,并提供一个 POST 资源,其 请求主体body请求内容类型mimeType

    获取操作 URL

    计划导航解析后的操作

    条目列表 被丢弃。

    带头部的邮件

    pairs 为使用 条目列表 转换为名称-值对列表 的结果。

    headers 为使用 pairsencoding 运行 application/x-www-form-urlencoded 序列化器 的结果。

    headers 中出现的 U+002B 加号字符 (+) 替换为字符串 "%20"。

    解析后的操作查询 设置为 headers

    计划导航解析后的操作

    作为邮件正文

    pairs 为使用 条目列表 转换为名称-值对列表 的结果。

    根据 enctype 切换

    text/plain

    body 为使用 pairs 运行 text/plain 编码算法 的结果。

    body 设置为使用 默认编码集body 运行 UTF-8 百分比编码 的结果。 [URL]

    否则

    body 为使用 pairsencoding 运行 application/x-www-form-urlencoded 序列化器 的结果。

    如果 解析后的操作查询 为 null,则将其设置为空字符串。

    如果 解析后的操作查询 不是空字符串,则在其后附加一个 U+0026 & 字符。

    将 "body=" 附加到 解析后的操作查询 后。

    body 附加到 解析后的操作查询 后。

    计划导航解析后的操作

4.10.21.4 构造条目列表

条目列表列表 中的 条目,通常表示表单的内容。条目 是一个元组,由 名称标量值字符串)和 标量值字符串文件 对象)组成。

要根据字符串 name、字符串或 Blob 对象 value 以及可选的 标量值字符串 filename 创建条目

  1. name 设置为 name 转换为 标量值字符串 的结果。

  2. 如果 value 是字符串,则将 value 设置为 value 转换为 标量值字符串 的结果。

  3. 否则

    1. 如果 value 不是一个 File 对象,则将 value 设置为一个新的 File 对象,表示相同的字节,其 name 属性值为 "blob"。

    2. 如果给定 filename,则将 value 设置为一个新的 File 对象,表示相同的字节,其 name 属性为 filename

    这些操作将在以下任一情况下创建一个新的 File 对象:给定 filename 或传递的 Blob 不是 File 对象。在这些情况下,不会保留传递的 Blob 对象的身份。

  4. 返回一个 条目,其 名称name,其 value

给定一个 form、一个可选的 submitter(默认为 null)和一个可选的 encoding(默认为 UTF-8),构建条目列表

  1. 如果 form构建条目列表 为 true,则返回 null。

  2. form构建条目列表 设置为 true。

  3. controls 为所有 可提交元素 的列表,这些元素的 表单所有者form,按照 树状顺序

  4. entry list 为一个新的空 条目列表

  5. 对于 controls 中的每个元素 field,按照 树状顺序

    1. 如果以下任何一项为真

      继续

    2. 如果 field 元素是一个 input 元素,其 type 属性处于 图像按钮 状态,则

      1. 如果 field 元素不是 submitter,则 继续

      2. 如果 field 元素指定了 name 属性且其值为非空字符串,则令 name 为该值后跟 U+002E (.)。否则,令 name 为空字符串。

      3. namexname 和 U+0078 (x) 的串联。

      4. nameyname 和 U+0079 (y) 的串联。

      5. 令 (xy) 为 选定的坐标

      6. 创建一个条目,其 namexx,并将其 追加entry list

      7. 创建一个条目,其 nameyy,并将其 追加entry list

      8. 继续.

    3. 如果 field 是一个 表单关联自定义元素,则执行给定 fieldentry list条目构建算法,然后 继续

    4. 如果 field 元素未指定 name 属性,或其 name 属性值为一个空字符串,则 继续

    5. namefield 元素的 name 属性的值。

    6. 如果 field 元素是一个 select 元素,则对于 select 元素的 选项列表 中的每个 option 元素,如果其 选中状态 为 true 且未 禁用,则 创建一个条目,其 nameoption 元素的 ,并将其 追加entry list

    7. 否则,如果 field 元素是一个 input 元素,其 type 属性处于 复选框 状态或 单选按钮 状态,则

      1. 如果 field 元素指定了 value 属性,则令 value 为该属性的值;否则,令 value 为字符串 "on"。

      2. 创建一个条目,其 namevalue,并将其 追加entry list

    8. 否则,如果 field 元素是一个 input 元素,其 type 属性处于 文件上传 状态,则

      1. 如果没有 选定的文件,则 创建一个条目,其 name 为一个新的 File 对象,该对象具有空名称、application/octet-stream 作为类型和一个空主体,并将其 追加entry list

      2. 否则,对于 选定的文件 中的每个文件,创建一个条目,其 name 为一个 File 对象,该对象表示该文件,并将其 追加entry list

    9. 否则,如果 field 元素是一个 input 元素,其 type 属性处于 隐藏 状态,且 name 与 "_charset_" 不区分大小写地匹配

      1. charsetencoding名称

      2. 创建一个条目,其 namecharset,并将其 追加entry list

    10. 否则,创建一个条目,其 namefield 元素的 ,并将其 追加entry list

    11. 如果元素具有 dirname 属性,该属性的值不是空字符串,并且该元素是 自动方向表单关联元素

      1. dirname 为元素的 dirname 属性的值。

      2. 如果元素的 方向性 为 'ltr',则令 dir 为字符串 "ltr",否则(即,当元素的 方向性 为 'rtl' 时),令 dir 为 "rtl"。

      3. 创建一个条目,其 dirnamedir,并将其 追加entry list

  6. form data 为一个新的与 entry list 关联的 FormData 对象。

  7. 触发一个名为 formdata 的事件,在 form 上使用 FormDataEvent,其中 formData 属性初始化为 form databubbles 属性初始化为 true。

  8. form构建条目列表 设置为 false。

  9. 返回条目列表克隆

4.10.21.5 选择表单提交编码

如果用户代理需要为表单选择编码,则必须运行以下步骤

  1. encoding文档的字符编码

  2. 如果表单元素具有accept-charset属性,则将encoding设置为运行以下子步骤的结果

    1. input表单元素的accept-charset属性的值。

    2. 候选编码标签input按ASCII空格分割的结果。

    3. 候选编码 为一个空的字符编码列表。

    4. 依次遍历候选编码标签中的每个标记(按其在input中找到的顺序),获取该标记的编码,如果这不会导致失败,则将编码追加到候选编码中。

    5. 如果候选编码为空,则返回UTF-8

    6. 返回候选编码中的第一个编码。

  3. 返回从encoding 获取输出编码的结果。

4.10.21.6 将条目列表转换为名称-值对列表

application/x-www-form-urlencodedtext/plain编码算法采用名称-值对列表,其中值必须是字符串,而不是条目列表,其中值可以是文件。以下算法执行转换。

条目列表entry list转换为名称-值对列表,请运行以下步骤

  1. list 为一个空的名称-值对列表

  2. 对于 entry list中的每个entry

    1. nameentry名称,其中每个不后跟U+000A (LF)的U+000D (CR)以及每个不前跟U+000D (CR)的U+000A (LF)都被替换为由U+000D (CR)和U+000A (LF)组成的字符串。

    2. 如果entry文件对象,则令valueentry名称。否则,令valueentry

    3. value中,替换每个不后跟U+000A (LF)的U+000D (CR)以及每个不前跟U+000D (CR)的U+000A (LF),替换为由U+000D (CR)和U+000A (LF)组成的字符串。

    4. 追加一个新的名称-值对到list,其名称为name,其值为value

  3. 返回list

4.10.21.7 URL 编码的表单数据

有关application/x-www-form-urlencoded的详细信息,请参阅URL[URL]

4.10.21.8 多部分表单数据

给定条目列表entry list编码encodingmultipart/form-data编码算法如下所示

  1. 对于entry list中的每个entry

    1. entry名称中,替换每个不后跟U+000A (LF)的U+000D (CR)以及每个不前跟U+000D (CR)的U+000A (LF),替换为由U+000D (CR)和U+000A (LF)组成的字符串。

    2. 如果entry不是文件对象,则在entry中,替换每个不后跟U+000A (LF)的U+000D (CR)以及每个不前跟U+000D (CR)的U+000A (LF),替换为由U+000D (CR)和U+000A (LF)组成的字符串。

  2. 返回使用RFC 7578中描述的规则对entry list进行编码后产生的字节序列,从表单返回值:multipart/form-data,在以下条件下: [RFC7578]

有关如何解释multipart/form-data有效负载的详细信息,请参阅RFC 7578。 [RFC7578]

4.10.21.9 纯文本表单数据

给定名称-值对列表pairstext/plain编码算法如下所示

  1. result 为空字符串。

  2. 对于pairs中的每个pair

    1. pair的名称追加到result

    2. 将一个U+003D 等号字符(=)追加到result

    3. pair的值追加到result

    4. 将一个U+000D 回车符(CR) U+000A 换行符(LF)字符对追加到result

  3. 返回result

使用text/plain格式的有效负载旨在供人类阅读。它们不能被计算机可靠地解释,因为格式不明确(例如,无法区分值中的字面换行符与值末尾的换行符)。

4.10.21.10 SubmitEvent接口

SubmitEvent

所有当前引擎都支持。

Firefox75+Safari15+Chrome81+
Opera?Edge81+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

SubmitEvent/SubmitEvent

所有当前引擎都支持。

Firefox75+Safari15+Chrome81+
Opera?Edge81+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
[Exposed=Window]
interface SubmitEvent : Event {
  constructor(DOMString type, optional SubmitEventInit eventInitDict = {});

  readonly attribute HTMLElement? submitter;
};

dictionary SubmitEventInit : EventInit {
  HTMLElement? submitter = null;
};
event.submitter

返回表示触发表单提交提交按钮的元素,如果提交不是由按钮触发的,则返回null。

submitter属性必须返回其初始化时所具有的值。

4.10.21.11 FormDataEvent接口

FormDataEvent/FormDataEvent

所有当前引擎都支持。

Firefox72+Safari15+Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?

FormDataEvent

所有当前引擎都支持。

Firefox72+Safari15+Chrome77+
Opera?Edge79+
Edge (Legacy)?Internet Explorer不支持
Firefox Android?Safari iOS?Chrome Android?WebView Android?Samsung Internet?Opera Android?
[Exposed=Window]
interface FormDataEvent : Event {
  constructor(DOMString type, FormDataEventInit eventInitDict);

  readonly attribute FormData formData;
};

dictionary FormDataEventInit : EventInit {
  required FormData formData;
};
event.formData

返回一个FormData对象,该对象表示与目标表单关联的元素的名称和值。对FormData对象的操作将影响要提交的表单数据。

formData属性必须返回其初始化时所具有的值。它表示与条目列表关联的FormData对象,该条目列表在提交表单构建

4.10.22 重置表单

表单元素form重置时,请运行以下步骤

  1. reset 为在form 上触发名为reset事件 的结果,其bubblescancelable 属性初始化为 true。

  2. 如果reset 为 true,则调用每个可重置元素重置算法,其表单所有者form

每个可重置元素 定义其自己的重置算法。作为这些算法一部分对表单控件所做的更改不计为用户引起的更改(因此,例如,不会导致input 事件触发)。