活文档 — 最后更新于 2024年9月12日
大多数表单控件都有一个 值 和一个 选中状态。(后者仅由 input
元素使用。)这些用于描述用户如何与控件交互。
控件的 值 是其内部状态。因此,它可能与用户的当前输入不匹配。
例如,如果用户在 数字字段(需要数字)中输入单词“three”,则用户的输入将是字符串“three”,但控件的 值 将保持不变。或者,如果用户在 电子邮件字段中输入电子邮件地址“ [email protected]”(带有前导空格),则用户的输入将是字符串“ [email protected]”,但电子邮件字段的浏览器 UI 可能会将其转换为 值“[email protected]
”(不带前导空格)。
input
和 textarea
元素具有 脏值标志。这用于跟踪 值 和默认值之间的交互。如果为 false,则 值 会反映默认值。如果为 true,则会忽略默认值。
input
、textarea
和 select
元素具有一个 用户有效性 布尔值。最初设置为 false。
为了定义在 input
元素的 multiple
属性面前约束验证的行为,input
元素也可以分别定义 值s。
为了定义 maxlength
和 minlength
属性的行为,以及特定于 textarea
元素的其他 API,所有具有 值 的表单控件也都有一个用于获取 API 值 的算法。默认情况下,此算法只是返回控件的 值。
select
元素没有 值;而是使用其 option
元素的 选中状态。
表单控件可以指定为 可变的。
这决定了(通过本规范中依赖于元素是否如此指定的定义和要求)用户是否可以修改表单控件的 值 或 选中状态,或者控件是否可以自动预填充。
一个 与表单关联的元素 可以与一个 form
元素存在关系,这称为元素的 表单所有者。如果一个 与表单关联的元素 未与 form
元素关联,则其 表单所有者 被认为是 null。
一个 与表单关联的元素 具有一个关联的 解析器插入标志。
所有当前引擎都支持。
所有当前引擎都支持。
一个 与表单关联的元素 默认情况下与其最近的祖先 form
元素关联(如下所述),但是,如果它 已列出,则可以指定 form
属性来覆盖此关联。
此功能允许作者解决嵌套 form
元素缺乏支持的问题。
如果一个 已列出 的 与表单关联的元素 指定了 form
属性,则该属性的值必须是元素 树 中 form
元素的 ID。
本节中的规则因以下事实而变得复杂:尽管符合规范的文档或 树 永远不会包含嵌套的 form
元素,但完全有可能(例如,使用执行 DOM 操作的脚本)生成具有此类嵌套元素的 树。它们也因 HTML 解析器中的规则而变得复杂,由于历史原因,这些规则可能导致 与表单关联的元素 与不是其祖先的 form
元素关联。
当创建 与表单关联的元素 时,其 表单所有者 必须初始化为 null(没有所有者)。
当 与表单关联的元素 将要与表单 关联 时,其 表单所有者 必须设置为该表单。
当 已列出 的 与表单关联的元素 的 form
属性被设置、更改或删除时,则用户代理必须 重置该元素的表单所有者。
当 已列出 的 与表单关联的元素 具有 form
属性,并且 树 中任何元素的 ID 发生更改时,则用户代理必须 重置该 与表单关联的元素 的表单所有者。
当一个已列出的与表单关联的元素具有form
属性,并且一个具有ID的元素被插入到或从文档
中移除时,则用户代理必须重置该与表单关联的元素的表单所有者。
要重置一个与表单关联的元素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
所有当前引擎都支持。
所有当前引擎都支持。
返回元素的表单所有者。
如果没有表单所有者,则返回 null。
已列出的与表单关联的元素(除了与表单关联的自定义元素)具有form
IDL 属性,在获取时,必须返回元素的表单所有者,如果没有表单所有者,则返回 null。
所有当前引擎都支持。
与表单关联的自定义元素没有form
IDL 属性。相反,它们的ElementInternals
对象具有form
IDL 属性。在获取时,如果目标元素不是与表单关联的自定义元素,则必须抛出"NotSupportedError
"DOMException
。否则,必须返回元素的表单所有者,如果没有表单所有者,则返回 null。
name
属性所有当前引擎都支持。
name
内容属性提供表单控件的名称,在表单提交和表单
元素的elements
对象中使用。如果指定了该属性,则其值不能是空字符串或 isindex
。
许多用户代理在历史上实现了对表单中第一个文本控件(名称为 isindex
)的特殊支持,并且此规范之前为此定义了相关的用户代理要求。但是,一些用户代理随后放弃了这种特殊支持,并且相关的要求已从此规范中删除。因此,为了避免在旧版用户代理中出现有问题的重新解释,不再允许使用名称 isindex
。
除了 isindex
之外,允许任何非空值作为name
。名称_charset_
的ASCII 不区分大小写匹配是特殊的:如果用作没有value
属性的 控件的名称,则在提交期间,value
属性会自动获得一个值,该值由提交字符编码组成。
DOM 覆盖是安全问题的一个常见原因。避免使用内置表单属性的名称作为name
内容属性。
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
属性。
dirname
属性所有当前引擎都支持。
表单控件元素上的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
maxlength
属性表单控件的 maxlength
属性,受 脏值标志 控制,声明了用户可以输入字符数量的限制。字符数量使用 长度 测量,对于 textarea
元素,所有换行符都规范化为单个字符(而不是 CRLF 对)。
如果某个元素指定了 表单控件的 maxlength
属性,则该属性的值必须是 有效的非负整数。如果指定了该属性,并且将其值应用于 解析非负整数的规则 会得到一个数字,则该数字就是元素的 最大允许值长度。如果省略该属性或解析其值导致错误,则没有 最大允许值长度。
约束验证:如果某个元素具有 最大允许值长度,其 脏值标志 为 true,其 值 上次由用户编辑更改(而不是由脚本更改),并且元素的 长度 超过元素的 最大允许值长度,则该元素 过长。
用户代理可以阻止用户将元素的 API 值 设置为 长度 超过元素的 最大允许值长度 的值。
对于 textarea
元素,API 值 和 值 不同。特别是,在检查 最大允许值长度 之前会应用 换行符规范化(而不会应用 textarea 换行转换)。
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 >
disabled
属性所有当前引擎都支持。
所有当前引擎都支持。
所有当前引擎都支持。
所有当前引擎都支持。
所有当前引擎都支持。
disabled
内容属性是一个 布尔属性。
disabled
属性用于 option
元素,disabled
属性用于 optgroup
元素,它们是分别定义的。
如果以下任何一项为真,则表单控件 已禁用
该元素是 button
、input
、select
、textarea
或 与表单关联的自定义元素,并且在该元素上指定了 disabled
属性(无论其值如何);或者
该元素是 fieldset
元素的后代,并且该 fieldset
元素的 disabled
属性已指定,并且不是该 fieldset
元素的第一个 legend
元素子元素(如果有)的后代。
已 禁用 的表单控件必须阻止在 用户交互任务源 上排队的任何 click
事件在该元素上分派。
所有当前引擎都支持。
所有当前引擎都支持。
disabled
IDL 属性必须 反映 disabled
内容属性。
所有当前引擎都支持。
表单提交属性 可以同时在 form
元素和 提交按钮(表示提交表单的按钮的元素,例如 input
元素,其 type
属性处于 提交按钮 状态)上指定。
可以在 form
元素上指定的 表单提交属性 是 action
、enctype
、method
、novalidate
和 target
。
可以在 提交按钮 上指定的相应的 表单提交属性 是 formaction
、formenctype
、formmethod
、formnovalidate
和 formtarget
。当省略时,它们默认为 form
元素上相应属性的值。
所有当前引擎都支持。
如果指定了 action
和 formaction
内容属性,则其值必须是 可能包含空格的有效非空 URL。
元素的 action 是元素的 formaction
属性的值(如果该元素是 提交按钮 并且具有此属性),或者其 表单所有者 的 action
属性的值(如果它具有该属性),否则为空字符串。
所有当前引擎都支持。
method
和 formmethod
内容属性是 枚举属性,具有以下关键字和状态
关键字 | 状态 | 简要说明 |
---|---|---|
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 >
在此示例中,form
与 dialog
一起使用。 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 >
所有当前引擎都支持。
enctype
和 formenctype
内容属性是 枚举属性,具有以下关键字和状态
application/x-www-form-urlencoded
”关键字和相应的状态。multipart/form-data
”关键字和相应的状态。text/plain
”关键字和相应的状态。该属性的 缺失值默认值 和 无效值默认值 均为 application/x-www-form-urlencoded
状态。
formenctype
属性没有 缺失值默认值,其 无效值默认值 为 application/x-www-form-urlencoded
状态。
元素的 enctype 是这三种状态之一。如果该元素是 提交按钮 并且具有 formenctype
属性,则该元素的 enctype 为该属性的状态;否则,为 表单所有者 的 enctype
属性的状态。
所有当前引擎都支持。
如果指定了 target
和 formtarget
内容属性,则其值必须是 有效的可导航目标名称或关键字。
所有当前引擎都支持。
novalidate
和 formnovalidate
内容属性是 布尔属性。如果存在,则表示在提交过程中不应验证表单。
如果该元素是 提交按钮 并且该元素的 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 >
所有当前引擎都支持。
所有当前引擎都支持。
所有当前引擎都支持。
所有当前引擎都支持。
所有当前引擎都支持。
action
IDL 属性必须反映同名内容属性,但获取时,如果内容属性缺失或其值为空字符串,则必须返回元素的节点文档的URL。target
IDL 属性必须反映同名内容属性。method
和 enctype
IDL 属性必须反映各自同名的内容属性,仅限于已知值。encoding
IDL 属性必须反映enctype
内容属性,仅限于已知值。noValidate
IDL 属性必须反映novalidate
内容属性。formAction
IDL 属性必须反映formaction
内容属性,但获取时,如果内容属性缺失或其值为空字符串,则必须返回元素的节点文档的URL。formEnctype
IDL 属性必须反映formenctype
内容属性,仅限于已知值。formMethod
IDL 属性必须反映formmethod
内容属性,仅限于已知值。formNoValidate
IDL 属性必须反映formnovalidate
内容属性。formTarget
IDL 属性必须反映formtarget
内容属性。
autocomplete
属性所有当前引擎都支持。
用户代理有时具有帮助用户填写表单的功能,例如根据用户之前的输入预填充用户的地址。autocomplete
内容属性可用于提示用户代理如何(或者是否)提供此类功能。
此属性有两种使用方式。当扮演自动填充预期角色时,autocomplete
属性描述了用户期望的输入。当扮演自动填充锚点角色时,autocomplete
属性描述了给定值的含义。
在input
元素上,如果其type
属性处于 状态,则autocomplete
属性扮演自动填充锚点角色。在所有其他情况下,它扮演自动填充预期角色。
当扮演自动填充预期角色时,如果指定了autocomplete
属性,则其值必须是按顺序排列的由空格分隔的标记集,该标记集包含以下内容之一:单个标记,该标记与字符串“off
”进行ASCII 不区分大小写匹配;或单个标记,该标记与字符串“on
”进行ASCII 不区分大小写匹配;或自动填充详细信息标记。
当扮演自动填充锚点角色时,如果指定了autocomplete
属性,则其值必须是按顺序排列的由空格分隔的标记集,该标记集仅包含自动填充详细信息标记(即,不允许使用“on
”和“off
”关键字)。
自动填充详细信息标记如下所示,按以下顺序排列
可选地,一个标记,其前八个字符与字符串“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 >
可选地,一个标记,该标记与以下字符串之一进行ASCII 不区分大小写匹配
shipping
”,表示该字段是送货地址或联系信息的一部分billing
”,表示该字段是账单地址或联系信息的一部分以下两个选项之一
一个标记,该标记与以下自动填充字段名称之一进行ASCII 不区分大小写匹配,但不包括不适用于该控件的名称
name
”honorific-prefix
”given-name
”additional-name
”family-name
”honorific-suffix
”nickname
”username
”new-password
”current-password
”one-time-code
”organization-title
”organization
”street-address
”address-line1
”address-line2
”address-line3
”address-level4
”address-level3
”address-level2
”address-level1
”country
”country-name
”postal-code
”cc-name
”cc-given-name
”cc-additional-name
”cc-family-name
”cc-number
”cc-exp
”
cc-exp-month
"cc-exp-year
"cc-csc
"cc-type
"transaction-currency
"transaction-amount
"language
"bday
"bday-day
"bday-month
"bday-year
"sex
"url
"photo
"(请参见下表了解这些值的描述。)
以下,按给定顺序
可选地,一个与以下字符串之一进行ASCII不区分大小写匹配的标记
home
",表示该字段用于联系某人在其住所的联系人信息work
",表示该字段用于联系某人在其工作场所的联系人信息mobile
",表示该字段用于联系某人,无论其所在位置fax
",表示该字段描述传真机的联系信息pager
",表示该字段描述寻呼机或传呼器的联系信息一个与以下自动填充字段名称之一进行ASCII不区分大小写匹配的标记,不包括那些不适用于控件的名称
tel
"tel-country-code
"tel-national
"tel-area-code
"tel-local
"tel-local-prefix
"tel-local-suffix
"tel-extension
"email
"impp
"(请参见下表了解这些值的描述。)
可选地,一个与字符串"webauthn
"进行ASCII不区分大小写匹配的标记,表示当用户与表单控件交互时,用户代理应显示通过条件
中介可用的公钥凭据。webauthn
仅对input
和textarea
元素有效。
如前所述,属性及其关键字的含义取决于属性所扮演的角色。
关键字"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)之前。鼓励作者提供符合国家规范的表单(根据用户更改的国家/地区相应地隐藏、显示和重新排列字段)。
每个应用了 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
”。
这些值定义为运行以下算法的结果
如果元素没有 autocomplete
属性,则跳转到标记为默认的步骤。
令tokens 为在 ASCII 空格处分割属性值的结果。
如果tokens 为空,则跳转到标记为默认的步骤。
令index 为tokens 中最后一个标记的索引。
令field 为tokens 中第index 个标记。
将category、maximum tokens 对设置为给定field 的确定字段类别的结果。
如果category 为 null,则跳转到标记为默认的步骤。
如果tokens 中标记的数量大于maximum tokens,则跳转到标记为默认的步骤。
如果category 为关闭或自动,但元素的 autocomplete
属性正在使用自动填充锚点外壳,则跳转到标记为默认的步骤。
如果category 为关闭,则令元素的自动填充字段名称 为字符串“off
”,令其自动填充提示集 为空,并令其IDL 公开自动填充值 为字符串“off
”。然后,返回。
如果category 为自动,则令元素的自动填充字段名称 为字符串“on
”,令其自动填充提示集 为空,并令其IDL 公开自动填充值 为字符串“on
”。然后,返回。
令scope tokens 为一个空列表。
令hint tokens 为一个空集。
令credential type 为 null。
令IDL value 与field 具有相同的值。
如果category 为凭据,并且tokens 中的第index 个标记与“webauthn
”不区分大小写地匹配,则运行以下子步骤
将credential type 设置为“webauthn
”。
如果tokens 中的第index 个标记是第一个条目,则跳过到标记为完成的步骤。
将index 减 1。
将category、maximum tokens 对设置为给定tokens 中的第index 个标记的确定字段类别的结果。
如果category 不是正常且category 不是联系,则跳转到标记为默认的步骤。
如果index 大于maximum tokens 减 1(即,如果剩余标记的数量大于maximum tokens),则跳转到标记为默认的步骤。
将IDL value 设置为tokens 中的第index 个标记、一个 U+0020 空格字符以及IDL value 的先前值的串联。
如果tokens 中的第index 个标记是第一个条目,则跳过到标记为完成的步骤。
将index 减 1。
如果category 为联系,并且tokens 中的第index 个标记与以下列表中的一个字符串不区分大小写地匹配,则运行以下子步骤
子步骤是
令contact 为上面列表中匹配的字符串。
在scope tokens 的开头插入contact。
将contact 添加到hint tokens。
将IDL value 设置为contact、一个 U+0020 空格字符以及IDL value 的先前值的串联。
如果tokens 中的第index 个条目是第一个条目,则跳过到标记为完成的步骤。
将index 减 1。
如果tokens 中的第index 个标记与以下列表中的一个字符串不区分大小写地匹配,则运行以下子步骤
子步骤是
令mode 为上面列表中匹配的字符串。
在scope tokens 的开头插入mode。
将mode 添加到hint tokens。
将IDL value 设置为mode、一个 U+0020 空格字符以及IDL value 的先前值的串联。
如果tokens 中的第index 个条目是第一个条目,则跳过到标记为完成的步骤。
将index 减 1。
如果tokens 中的第index 个条目不是第一个条目,则跳转到标记为默认的步骤。
如果tokens 中的第index 个标记的前八个字符与字符串“section-
”不区分大小写地匹配,则跳转到标记为默认的步骤。
令section 为tokens 中的第index 个标记,转换为 ASCII 小写。
在scope tokens 的开头插入section。
将IDL value 设置为section、一个 U+0020 空格字符以及IDL value 的先前值的串联。
完成:令元素的自动填充提示集 为hint tokens。
令元素的非自动填充凭据类型 为credential type。
令元素的自动填充范围 为scope tokens。
令元素的自动填充字段名称 为field。
令元素的IDL 公开自动填充值 为IDL value。
返回。
默认:令元素的IDL 公开自动填充值 为空字符串,并令其自动填充提示集 和自动填充范围 为空。
如果元素的 autocomplete
属性正在使用自动填充锚点外壳,则令元素的自动填充字段名称 为空字符串并返回。
令form 为元素的表单所有者(如果有),否则为 null。
如果 form 不为空,并且 form 的 autocomplete
属性处于 关闭 状态,则将元素的 自动填充字段名称 设置为 "关闭
"。
要 确定字段的类别,给定 field
如果 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 | 凭证 |
否则,将 最大标记数 和 类别 分别设置为该行第二列和第三列单元格的值。
返回对 (类别, 最大标记数)。
出于自动填充的目的,控件的数据 取决于控件的类型
输入
元素,其 type
属性处于 电子邮件 状态,并且指定了 multiple
属性输入
元素文本区域
元素选择
元素,其 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 >
这可能会呈现如下
假设在第一次访问此页面时,用户选择了“赞比亚”。在第二次访问时,用户代理可以在列表顶部复制赞比亚的条目,以便界面改为如下所示
当 自动填充字段名称 为 "开启
" 时,用户代理应尝试使用启发式方法来确定向用户提供最合适的值,例如,根据元素的 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 日,则它可能会尝试使用略微不同的值预填充以下所有控件,所有这些值都来自此信息
| 2012-07 | 由于Month状态仅接受月/年组合,因此会删除日期。(请注意,此示例不符合规范,因为自动填充字段名称bday 不允许与Month状态一起使用。) |
| 七月 | 用户代理从列出的选项中选择月份,方法是注意到有 12 个选项并选择第 7 个,或者识别其中一个字符串(三个字符“Jul”后跟换行符和空格)与用户代理支持的语言之一中月份(七月)的名称非常接近,或者通过其他类似机制。 |
| 7 | 用户代理将“七月”转换为 1..12 范围内的月份编号,就像该字段一样。 |
| 6 | 用户代理将“七月”转换为 0..11 范围内的月份编号,就像该字段一样。 |
| 用户代理不填充该字段,因为它无法很好地猜测表单期望的内容。 |
用户代理可以允许用户覆盖元素的自动填充字段名称,例如,将其从"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-password ” | “new-password ” |
在获取时,autocomplete
IDL 属性必须返回元素的IDL 公开自动填充值,在设置时,必须反映同名内容属性。
input
和textarea
元素定义了几个用于处理其选择的属性和方法。它们的共享算法在此定义。
element.select()
选择文本控件中的所有内容。
element.selectionStart [ = value ]
返回选择开始处的偏移量。
可以设置,以更改选择的开始位置。
element.selectionEnd [ = value ]
返回选择结束处的偏移量。
可以设置,以更改选择的结束位置。
element.selectionDirection [ = value ]
返回当前的选择方向。
可以设置,以更改选择的方向。
可能的值为“forward
”、“backward
”和“none
”。
element.setSelectionRange(start, end [, direction])
HTMLInputElement/setSelectionRange
所有当前引擎都支持。
将选择更改为覆盖给定方向中的给定子字符串。如果省略方向,则将其重置为平台默认值(无或向前)。
element.setRangeText(replacement [, start, end [, selectionMode ] ])
所有当前引擎都支持。
用新文本替换一段文本。如果未提供start和end参数,则假定范围为选择。
最后一个参数确定替换文本后如何设置选择。可能的值为
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 适用的元素的相关值发生变化时,请运行以下步骤
如果元素具有选择
在某些相关值发生变化的情况下,规范的其他部分也将修改文本输入光标位置,而不仅仅是上述钳位步骤。例如,请参阅value
设置器(用于textarea
)。
在可能的情况下,用于更改input
和textarea
元素中文本选择的用户界面功能必须使用设置选择范围算法来实现,以便例如,所有相同的事件都触发。
input
和textarea
元素的选择具有选择方向,该方向为“forward
”、“backward
”或“none
”。选择方向的确切含义取决于平台。此方向在用户操作选择时设置。如果平台支持该方向,则初始选择方向必须为“none
”,否则为“forward
”。
要将元素的选择方向设置为给定方向,请将元素的选择方向更新为给定方向,除非方向为“none
”并且平台不支持该方向;在这种情况下,请将元素的选择方向更新为“forward
”。
在 Windows 上,方向指示插入符号相对于选择的位置:“forward
”选择将插入符号置于选择的末尾,“backward
”选择将插入符号置于选择的开头。Windows 没有“none
”方向。
在 Mac 上,方向指示用户使用 Shift 键修饰符和方向键调整选择大小时受影响的选择的哪一端:“forward
”方向表示选择末尾被修改,“backward
”方向表示选择的开头被修改。“none
”方向是 Mac 上的默认方向,它表示尚未选择任何特定方向。用户在第一次调整选择时会隐式设置方向,具体取决于使用了哪个方向键。
所有当前引擎都支持。
调用时,select()
方法必须运行以下步骤
如果此元素是input
元素,并且select()
不适用于此元素或相应的控件没有可选文本,则返回。
例如,在用户代理中,<input type=color>
呈现为带选取器的颜色井,而不是接受十六进制颜色代码的文本控件,则没有可选文本,因此会忽略对该方法的调用。
设置选择范围,范围为 0 到无穷大。
selectionStart
属性的 getter 必须运行以下步骤
如果此元素是input
元素,并且selectionStart
不适用于此元素,则返回 null。
属性的设置器必须执行以下步骤selectionStart
如果此元素是input
元素,并且selectionStart
不适用于此元素,则抛出一个"InvalidStateError
" DOMException
。
令end 为此元素的selectionEnd
属性的值。
如果end 小于给定值,则将end 设置为给定值。
设置选择范围,使用给定值、end 和此元素的selectionDirection
属性的值。
selectionEnd
属性的获取器必须执行以下步骤
如果此元素是input
元素,并且selectionEnd
不适用于此元素,则返回 null。
属性的设置器必须执行以下步骤selectionEnd
如果此元素是input
元素,并且selectionEnd
不适用于此元素,则抛出一个"InvalidStateError
" DOMException
。
设置选择范围,使用此元素的selectionStart
属性的值、给定值和此元素的selectionDirection
属性的值。
selectionDirection
属性的获取器必须执行以下步骤
如果此元素是input
元素,并且selectionDirection
不适用于此元素,则返回 null。
返回此元素的选择方向。
属性的设置器必须执行以下步骤selectionDirection
如果此元素是input
元素,并且selectionDirection
不适用于此元素,则抛出一个"InvalidStateError
" DOMException
。
设置选择范围,使用此元素的selectionStart
属性的值、此元素的selectionEnd
属性的值和给定值。
setSelectionRange(start, end, direction)
方法在调用时,必须执行以下步骤
如果此元素是input
元素,并且setSelectionRange()
不适用于此元素,则抛出一个"InvalidStateError
" DOMException
。
设置选择范围,使用start、end 和direction。
要使用整数或 null 的start、整数或 null 或特殊值 infinity 的end 以及可选的字符串direction 设置选择范围,请执行以下步骤
如果start 为 null,则令start 为零。
如果end 为 null,则令end 为零。
将文本控件的选择设置为相关值中的一系列代码单元,从第start个位置(逻辑顺序)的代码单元开始,到第(end-1)个位置的代码单元结束。大于文本控件相关值长度(包括特殊值 infinity)的参数必须视为指向文本控件的末尾。如果end 小于或等于start,则选择开始和选择结束都必须放置在偏移量为end的字符之前。在没有空选择概念的 UA 中,这必须将光标设置为偏移量为end的字符之前。
如果direction 与“backward
”或“forward
”都不相同,或者如果没有给出direction 参数,则将direction 设置为“none
”。
如果前面的步骤导致文本控件的选择被修改(范围或方向),则在给定元素的用户交互任务源上排队一个元素任务,以触发名为select
的事件,该事件在元素上触发,其bubbles
属性初始化为 true。
setRangeText(replacement, start, end, selectMode)
方法在调用时,必须执行以下步骤
如果此元素是input
元素,并且setRangeText()
不适用于此元素,则抛出一个"InvalidStateError
" DOMException
。
将此元素的脏值标志设置为 true。
如果该方法只有一个参数,则令start 和end 分别具有selectionStart
属性和selectionEnd
属性的值。
否则,令start、end 分别具有第二个和第三个参数的值。
如果start 大于end,则抛出一个"IndexSizeError
" DOMException
。
令selection start 为selectionStart
属性的当前值。
令selection end 为selectionEnd
属性的当前值。
如果start 小于end,则删除元素相关值中的一系列代码单元,从第start个位置的代码单元开始,到第(end-1)个位置的代码单元结束。
令新长度为第一个参数值的长度。
令新结束位置为开始位置和新长度的和。
从以下列表中运行相应的子步骤
select
"令选择开始位置为开始位置。
令选择结束位置为新结束位置。
start
"令选择开始位置和选择结束位置都为开始位置。
end
"令选择开始位置和选择结束位置都为新结束位置。
preserve
"令旧长度为结束位置减去开始位置。
令增量为新长度减去旧长度。
如果选择开始位置大于结束位置,则将其增加增量。(如果增量为负数,即新文本比旧文本短,则这将减少选择开始位置的值。)
否则:如果选择开始位置大于开始位置,则将其设置为开始位置。(如果选择开始位置在被替换文本的中间,则此操作会将其捕捉到新文本的开头。)
如果选择结束位置大于结束位置,则以相同的方式将其增加增量。
否则:如果选择结束位置大于开始位置,则将其设置为新结束位置。(如果选择结束位置在被替换文本的中间,则此操作会将其捕捉到新文本的结尾。)
使用选择开始位置和选择结束位置设置选择范围。
方法使用以下枚举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);
一个可提交元素是一个约束验证候选对象,除非某个条件禁止该元素进行约束验证。(例如,如果一个元素具有数据列表
元素祖先,则它被禁止进行约束验证。)
一个元素可以定义一个自定义有效性错误消息。最初,一个元素必须将其自定义有效性错误消息设置为空字符串。当其值不是空字符串时,该元素存在自定义错误。可以使用setCustomValidity()
方法设置它,除了与表单关联的自定义元素。 与表单关联的自定义元素可以通过其ElementInternals
对象的setValidity()
方法设置自定义有效性错误消息。用户代理应在提醒用户控件存在问题时使用自定义有效性错误消息。
一个元素可以通过多种方式进行约束。以下是表单控件可能处于的有效性状态列表,这些状态使控件对于约束验证而言无效。(以下定义是非规范性的;本规范的其他部分更精确地定义了每种状态何时适用或不适用。)
当一个控件没有值但具有required
属性(输入
required
,文本区域
required
);或者,对于选择
元素和单选按钮组中的控件,规则更加复杂,如各自章节中所述。
当setValidity()
方法为与表单关联的自定义元素将valueMissing
标志设置为true时。
当允许任意用户输入的控件具有值,但该值语法不正确(电子邮件,URL)。
当setValidity()
方法为与表单关联的自定义元素将typeMismatch
标志设置为true时。
当setValidity()
方法为与表单关联的自定义元素将patternMismatch
标志设置为true时。
当一个控件的值对于表单控件maxlength
属性(输入
maxlength
,文本区域
maxlength
)而言过长。
当setValidity()
方法为与表单关联的自定义元素将tooLong
标志设置为true时。
当一个控件的值对于表单控件minlength
属性(输入
minlength
,文本区域
minlength
)而言过短。
当setValidity()
方法为与表单关联的自定义元素将tooShort
标志设置为true时。
当setValidity()
方法为与表单关联的自定义元素将rangeUnderflow
标志设置为true时。
当setValidity()
方法为与表单关联的自定义元素将rangeOverflow
标志设置为true时。
当setValidity()
方法为与表单关联的自定义元素将stepMismatch
标志设置为true时。
当一个控件的输入不完整,并且用户代理认为用户不应该能够以其当前状态提交表单。
当setValidity()
方法为与表单关联的自定义元素将badInput
标志设置为true时。
当一个控件的自定义有效性错误消息(由元素的setCustomValidity()
方法或ElementInternals
的setValidity()
方法设置)不是空字符串。
即使元素已禁用,元素仍然可能处于这些状态;因此,即使在提交过程中验证表单不会向用户指示问题,这些状态也可以在DOM中表示。
如果一个元素没有处于上述任何有效性状态,则它满足其约束条件。
当用户代理需要静态验证表单
元素表单的约束条件时,它必须运行以下步骤,这些步骤将返回肯定结果(表单中的所有控件均有效)或否定结果(存在无效控件),以及一个(可能为空)的无效元素列表,并且没有脚本声明对此负责
令无效控件为一个最初为空的元素列表。
对于 controls 中的每个元素 field,按照 树的顺序
如果 invalid controls 为空,则返回肯定的结果。
令 unhandled invalid controls 为一个最初为空的元素列表。
对于 invalid controls 中的每个元素 field(如果有),按照 树的顺序
令 notCanceled 为在 field 上触发名为 invalid
的事件的结果,其中 cancelable
属性初始化为 true。
如果 notCanceled 为 true,则将 field 添加到 unhandled invalid controls 中。
返回带有 unhandled invalid controls 列表中元素列表的否定结果。
如果用户代理要交互式地验证 表单
元素 form 的约束条件,则用户代理必须运行以下步骤
静态验证 form 的约束条件,并令 unhandled invalid controls 为如果结果为否定则返回的元素列表。
如果结果为肯定,则返回该结果。
向用户报告 unhandled invalid controls 中给出的至少一个元素的约束条件问题。
用户代理可能会在过程中聚焦这些元素之一,方法是对该元素运行 聚焦步骤,并且可能会更改文档的滚动位置,或者执行一些其他操作以将元素提请用户注意。对于 表单关联的自定义元素,用户代理应出于这些操作的目的使用其 验证锚点。
用户代理可能会报告多个约束违规。
如果合适,用户代理可能会将相关的约束违规报告合并(例如,如果 组 中的多个单选按钮被标记为必填,则只需要报告一个错误)。
如果其中一个控件未呈现(例如,已设置 属性),则用户代理可能会报告脚本错误。
返回否定的结果。
element.willValidate
HTMLObjectElement/willValidate
所有当前引擎都支持。
如果在提交表单时将验证元素,则返回 true;否则返回 false。
element.setCustomValidity(message)
HTMLObjectElement/setCustomValidity
所有当前引擎都支持。
HTMLSelectElement/setCustomValidity
所有当前引擎都支持。
设置自定义错误,以便元素无法验证。给定的消息是在向用户报告问题时向用户显示的消息。
如果参数为空字符串,则清除自定义错误。
element.validity.valueMissing
所有当前引擎都支持。
如果元素没有值但却是必填字段,则返回 true;否则返回 false。
element.validity.typeMismatch
如果元素的值语法不正确,则返回 true;否则返回 false。
element.validity.patternMismatch
如果元素的值与提供的模式不匹配,则返回 true;否则返回 false。
element.validity.tooLong
所有当前引擎都支持。
如果元素的值长于提供的最大长度,则返回 true;否则返回 false。
element.validity.tooShort
所有当前引擎都支持。
如果元素的值(如果它不是空字符串)短于提供的最小长度,则返回 true;否则返回 false。
element.validity.rangeUnderflow
如果元素的值低于提供的最小值,则返回 true;否则返回 false。
element.validity.rangeOverflow
如果元素的值高于提供的最大值,则返回 true;否则返回 false。
element.validity.stepMismatch
如果元素的值不符合 step
属性给出的规则,则返回 true;否则返回 false。
element.validity.badInput
所有当前引擎都支持。
如果用户在用户界面中提供了用户代理无法转换为值的输入,则返回 true;否则返回 false。
element.validity.customError
如果元素有自定义错误,则返回 true;否则返回 false。
element.validity.valid
如果元素的值没有有效性问题,则返回 true;否则返回 false。
valid = element.checkValidity()
HTMLInputElement/checkValidity
所有当前引擎都支持。
HTMLObjectElement/checkValidity
所有当前引擎都支持。
HTMLSelectElement/checkValidity
所有当前引擎都支持。
如果元素的值没有有效性问题,则返回 true;否则返回 false。在后一种情况下,在元素上触发 invalid
事件。
valid = element.reportValidity()
HTMLFormElement/reportValidity
所有当前引擎都支持。
HTMLInputElement/reportValidity
所有当前引擎都支持。
如果元素的值没有有效性问题,则返回 true;否则,返回 false,在元素上触发 invalid
事件,并且(如果事件未被取消)向用户报告问题。
element.validationMessage
HTMLObjectElement/validationMessage
所有当前引擎都支持。
返回如果要检查元素的有效性,则将向用户显示的错误消息。
willValidate
属性的 getter 必须返回 true,如果此元素是 约束验证的候选对象,否则返回 false(即,如果任何条件 阻止它进行约束验证,则返回 false)。
所有当前引擎都支持。
willValidate
属性的 ElementInternals
接口,在获取时,如果 目标元素 不是 表单关联的自定义元素,则必须抛出一个 "NotSupportedError
" DOMException
。否则,如果 目标元素 是 约束验证的候选对象,则必须返回 true,否则返回 false。
HTMLInputElement/setCustomValidity
所有当前引擎都支持。
setCustomValidity(error)
方法的步骤如下:
将 error 设置为给定 error 后 规范化换行符 的结果。
将 自定义有效性错误消息 设置为 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 >
所有当前引擎都支持。
validity
属性的 getter 必须返回一个 ValidityState
对象,该对象表示此元素的 有效性状态。此对象是 动态的。
所有当前引擎都支持。
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
所有当前引擎都支持。
该控件 类型不匹配。
patternMismatch
所有当前引擎都支持。
该控件 与模式不匹配。
tooLong
该控件 过长。
tooShort
该控件 过短。
rangeUnderflow
所有当前引擎都支持。
该控件 值小于范围下限。
rangeOverflow
所有当前引擎都支持。
该控件 值大于范围上限。
stepMismatch
所有当前引擎都支持。
该控件 步长不匹配。
badInput
该控件 输入无效。
customError
该控件 存在自定义错误。
valid
以上所有条件都不成立。
元素 element 的 检查有效性步骤 如下:
如果 element 是 约束验证的候选对象 且 不满足其约束条件,则
触发名为 invalid
的事件,该事件在 element 上触发,其 cancelable
属性初始化为 true(尽管取消没有任何效果)。
返回 false。
返回 true。
当调用 checkValidity()
方法时,必须在此元素上运行 检查有效性步骤。
ElementInternals/checkValidity
所有当前引擎都支持。
ElementInternals
接口的 checkValidity()
方法必须运行以下步骤
令 element 为此 ElementInternals
的 目标元素。
如果 element 不是 与表单关联的自定义元素,则抛出一个 "NotSupportedError
" DOMException
。
在 element 上运行 检查有效性步骤。
元素 element 的 报告有效性步骤 如下:
如果 element 是 约束验证的候选对象 且 不满足其约束条件,则
令 report 为 触发名为 invalid
的事件的结果,该事件在 element 上触发,其 cancelable
属性初始化为 true。
如果 report 为 true,则向用户报告此元素约束条件的问题。在向用户报告约束条件问题时,用户代理可能会为 element 运行 聚焦步骤,并且可能会更改文档的滚动位置,或者执行其他一些使 element 引起用户注意的操作。如果 element 同时存在多个问题,则用户代理可能会报告多个约束违规。
返回 false。
返回 true。
当调用 reportValidity()
方法时,必须在此元素上运行 报告有效性步骤。
ElementInternals/reportValidity
所有当前引擎都支持。
ElementInternals
接口的 reportValidity()
方法必须运行以下步骤
令 element 为此 ElementInternals
的 目标元素。
如果 element 不是 与表单关联的自定义元素,则抛出一个 "NotSupportedError
" DOMException
。
在 element 上运行 报告有效性步骤。
validationMessage
属性的 getter 必须运行以下步骤
返回用户代理在这种情况(如果这是唯一一个存在有效性约束问题的表单控件)下向用户显示的适当本地化消息。如果用户代理在这种情况下实际上不会显示文本消息(例如,它会显示图形提示),则返回一个适当本地化的消息,该消息表达了控件不满足的(一个或多个)有效性约束。如果元素是 约束验证的候选对象 并且 存在自定义错误,则 自定义有效性错误消息 应出现在返回值中。
服务器不应依赖于客户端验证。客户端验证可以被恶意用户有意绕过,也可以被使用旧版用户代理或未实现这些功能的自动化工具的用户无意中绕过。约束验证功能仅用于改善用户体验,而不是提供任何类型的安全机制。
本节是非规范性的。
当提交表单时,表单中的数据将转换为 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--
form
元素的 默认按钮 是 树序 中第一个 表单所有者 为该 form
元素的 提交按钮。
如果用户代理支持让用户隐式提交表单(例如,在某些平台上,当文本控件获得焦点时按下“Enter”键会隐式提交表单),那么对于表单,其默认按钮具有激活行为且未禁用,这样做必须导致用户代理在该默认按钮上触发一个click
事件。
网络上有一些页面只有在存在隐式提交表单的方式时才能使用,因此强烈建议用户代理支持此功能。
如果表单没有提交按钮,则隐式提交机制必须执行以下步骤
如果表单有多个阻止隐式提交的字段,则返回。
提交来自表单
元素本身的表单
元素,并将userInvolvement设置为"activation
"。
出于上一段的目的,如果一个元素是表单
元素的阻止隐式提交的字段,则它必须是输入
元素,其表单所有者为该表单
元素,且其type
属性处于以下状态之一:文本、搜索、电话、URL、电子邮件、密码、日期、月份、星期、时间、本地日期和时间、数字。
每个表单
元素都有一个构建条目列表布尔值,初始值为false。
每个表单
元素都有一个触发提交事件布尔值,初始值为false。
要提交一个来自元素submitter(通常是按钮)的表单
元素form,给定一个可选的布尔值从submit()
方法提交(默认为false)和一个可选的用户导航参与userInvolvement(默认为"none
")
如果form无法导航,则返回。
如果form的构建条目列表为true,则返回。
令表单文档为form的节点文档。
如果表单文档的活动沙箱标志集已设置其沙箱表单浏览上下文标志,则返回。
如果从submit()
方法提交为false,则
如果form的触发提交事件为true,则返回。
将form的触发提交事件设置为true。
如果submitter元素的no-validate状态为false,则交互式验证form的约束并检查结果。如果结果为负(即,约束验证得出结论,存在无效字段,并可能已告知用户此情况),则
将form的触发提交事件设置为false。
返回。
如果submitter为form,则令submitterButton为null。否则,令submitterButton为submitter。
令shouldContinue为使用SubmitEvent
在form上触发名为submit
的事件的结果,其中submitter
属性初始化为submitterButton,bubbles
属性初始化为true,并且cancelable
属性初始化为true。
将form的触发提交事件设置为false。
如果shouldContinue为false,则返回。
如果form无法导航,则返回。
令encoding为为表单选择编码的结果。
令条目列表为使用form、submitter和encoding构建条目列表的结果。
断言:条目列表不为null。
如果form无法导航,则返回。
令method为submitter元素的方法。
如果method为dialog,则
令action为submitter元素的操作。
如果action为空字符串,则令action为表单文档的URL。
如果已解析的操作失败,则返回。
令scheme为已解析的操作的方案。
令enctype为submitter元素的enctype。
令formTarget为null。
如果submitter元素是提交按钮并且它具有formtarget
属性,则将formTarget设置为formtarget
属性值。
令noopener为使用form和target获取元素的noopener的结果。
令targetNavigable为给定target、form的节点可导航和noopener选择可导航的规则应用的第一个返回值。
如果targetNavigable为null,则返回。
令historyHandling为"auto
"。
如果表单文档等于targetNavigable的活动文档,并且表单文档尚未完全加载,则将historyHandling设置为"replace
"。
根据表格每行第一单元格给出的 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 时,它必须运行以下步骤
令 referrerPolicy 为空字符串。
如果 form
元素的 链接类型 包含 noreferrer
关键字,则将 referrerPolicy 设置为 "no-referrer
"。
在 DOM 操作任务源上为 form
元素排队一个元素任务,并执行以下步骤
使用 form
元素的 节点文档,将 targetNavigable 导航 到 url,其中 historyHandling 设置为 historyHandling,userInvolvement 设置为 userInvolvement,referrerPolicy 设置为 referrerPolicy,documentResource 设置为 postResource,以及 formDataEntryList 设置为 条目列表。
行为如下
令 pairs 为使用 条目列表 转换为名称-值对列表 的结果。
令 query 为使用 pairs 和 encoding 运行 application/x-www-form-urlencoded
序列化器 的结果。
将 解析后的操作 的 查询 组件设置为 query。
计划导航 到 解析后的操作。
根据 enctype 切换
application/x-www-form-urlencoded
令 pairs 为使用 条目列表 转换为名称-值对列表 的结果。
令 body 为使用 pairs 和 encoding 运行 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。
计划导航 到 解析后的操作。
条目列表 被丢弃。
令 pairs 为使用 条目列表 转换为名称-值对列表 的结果。
令 headers 为使用 pairs 和 encoding 运行 application/x-www-form-urlencoded
序列化器 的结果。
将 headers 中出现的 U+002B 加号字符 (+) 替换为字符串 "%20
"。
将 解析后的操作 的 查询 设置为 headers。
计划导航 到 解析后的操作。
令 pairs 为使用 条目列表 转换为名称-值对列表 的结果。
根据 enctype 切换
text/plain
令 body 为使用 pairs 运行 text/plain
编码算法 的结果。
将 body 设置为使用 默认编码集 对 body 运行 UTF-8 百分比编码 的结果。 [URL]
令 body 为使用 pairs 和 encoding 运行 application/x-www-form-urlencoded
序列化器 的结果。
如果 解析后的操作 的 查询 为 null,则将其设置为空字符串。
如果 解析后的操作 的 查询 不是空字符串,则在其后附加一个 U+0026 & 字符。
将 "body=
" 附加到 解析后的操作 的 查询 后。
将 body 附加到 解析后的操作 的 查询 后。
计划导航 到 解析后的操作。
条目列表 是 列表 中的 条目,通常表示表单的内容。条目 是一个元组,由 名称(标量值字符串)和 值(标量值字符串 或 文件
对象)组成。
要根据字符串 name、字符串或 Blob
对象 value 以及可选的 标量值字符串 filename 创建条目
否则
如果 value 不是一个 File
对象,则将 value 设置为一个新的 File
对象,表示相同的字节,其 name
属性值为 "blob
"。
如果给定 filename,则将 value 设置为一个新的 File
对象,表示相同的字节,其 name
属性为 filename。
这些操作将在以下任一情况下创建一个新的 File
对象:给定 filename 或传递的 Blob
不是 File
对象。在这些情况下,不会保留传递的 Blob
对象的身份。
给定一个 form、一个可选的 submitter(默认为 null)和一个可选的 encoding(默认为 UTF-8),构建条目列表
如果 form 的 构建条目列表 为 true,则返回 null。
将 form 的 构建条目列表 设置为 true。
令 entry list 为一个新的空 条目列表。
对于 controls 中的每个元素 field,按照 树状顺序
如果以下任何一项为真
则 继续。
如果 field 是一个 表单关联自定义元素,则执行给定 field 和 entry list 的 条目构建算法,然后 继续。
令 name 为 field 元素的 name
属性的值。
如果 field 元素是一个 select
元素,则对于 select
元素的 选项列表 中的每个 option
元素,如果其 选中状态 为 true 且未 禁用,则 创建一个条目,其 name 为 option
元素的 值,并将其 追加 到 entry list。
否则,如果 field 元素是一个 input
元素,其 type
属性处于 状态,且 name 与 "_charset_
" 不区分大小写地匹配
如果元素具有 dirname
属性,该属性的值不是空字符串,并且该元素是 自动方向表单关联元素
令 form data 为一个新的与 entry list 关联的 FormData
对象。
触发一个名为 formdata
的事件,在 form 上使用 FormDataEvent
,其中 formData
属性初始化为 form data,bubbles
属性初始化为 true。
将 form 的 构建条目列表 设置为 false。
返回条目列表的克隆。
如果用户代理需要为表单选择编码,则必须运行以下步骤
令encoding 为文档的字符编码。
如果表单
元素具有accept-charset
属性,则将encoding设置为运行以下子步骤的结果
令input 为表单
元素的accept-charset
属性的值。
令候选编码标签为将input按ASCII空格分割的结果。
令候选编码 为一个空的字符编码列表。
依次遍历候选编码标签中的每个标记(按其在input中找到的顺序),获取该标记的编码,如果这不会导致失败,则将编码追加到候选编码中。
如果候选编码为空,则返回UTF-8。
返回候选编码中的第一个编码。
返回从encoding 获取输出编码的结果。
application/x-www-form-urlencoded
和text/plain
编码算法采用名称-值对列表,其中值必须是字符串,而不是条目列表,其中值可以是文件
。以下算法执行转换。
要将条目列表entry list转换为名称-值对列表,请运行以下步骤
令list 为一个空的名称-值对列表。
返回list。
有关application/x-www-form-urlencoded
的详细信息,请参阅URL。 [URL]
给定条目列表entry list和编码encoding,multipart/form-data
编码算法如下所示
返回使用RFC 7578中描述的规则对entry list进行编码后产生的字节序列,从表单返回值:multipart/form-data
,在以下条件下: [RFC7578]
部分的顺序必须与entry list中字段的顺序相同。具有相同名称的多个条目必须被视为不同的字段。
生成的multipart/form-data
资源中的字段名称、非文件字段的字段值以及文件字段的文件名必须设置为使用encoding对相应条目的名称或值进行编码并转换为字节序列的结果。
对于字段名称和文件字段的文件名,上一个要点中编码的结果必须通过以下方式进行转义:将任何0x0A (LF)字节替换为字节序列`%0A
`,将0x0D (CR)替换为`%0D
`,将0x22 (")替换为`%22
`。用户代理不得执行任何其他转义。
生成的multipart/form-data
资源中对应于非文件字段的部分不得指定`Content-Type
`标头。
用户代理在生成此算法的返回值时使用的边界是multipart/form-data
边界字符串。(此值用于生成此算法生成的表单提交有效负载的MIME类型。)
有关如何解释multipart/form-data
有效负载的详细信息,请参阅RFC 7578。 [RFC7578]
给定名称-值对列表pairs,text/plain
编码算法如下所示
令result 为空字符串。
对于pairs中的每个pair
将pair的名称追加到result。
将一个U+003D 等号字符(=)追加到result。
将pair的值追加到result。
将一个U+000D 回车符(CR) U+000A 换行符(LF)字符对追加到result。
返回result。
使用text/plain
格式的有效负载旨在供人类阅读。它们不能被计算机可靠地解释,因为格式不明确(例如,无法区分值中的字面换行符与值末尾的换行符)。
SubmitEvent
接口所有当前引擎都支持。
所有当前引擎都支持。
[Exposed =Window ]
interface SubmitEvent : Event {
constructor (DOMString type , optional SubmitEventInit eventInitDict = {});
readonly attribute HTMLElement ? submitter ;
};
dictionary SubmitEventInit : EventInit {
HTMLElement ? submitter = null ;
};
submitter
属性必须返回其初始化时所具有的值。
FormDataEvent
接口所有当前引擎都支持。
所有当前引擎都支持。
[Exposed =Window ]
interface FormDataEvent : Event {
constructor (DOMString type , FormDataEventInit eventInitDict );
readonly attribute FormData formData ;
};
dictionary FormDataEventInit : EventInit {
required FormData formData ;
};
formData
属性必须返回其初始化时所具有的值。它表示与条目列表关联的FormData
对象,该条目列表在提交表单
时构建。
当表单
元素form重置时,请运行以下步骤
令reset 为在form 上触发名为reset
的事件 的结果,其bubbles
和cancelable
属性初始化为 true。
每个可重置元素 定义其自己的重置算法。作为这些算法一部分对表单控件所做的更改不计为用户引起的更改(因此,例如,不会导致input
事件触发)。