Web 开发人员版 — 最后更新于 2024年9月12日
当使用以下算法之一加载文档时,我们使用以下步骤来创建和初始化 Document
对象,给定一个类型 type、内容类型 contentType 和导航参数 navigationParams
当创建新的浏览上下文和文档时,也会创建 Document
对象;此算法永远不会创建此类初始 about:blank
Document
。此外,可以通过各种 API(例如document.implementation.createHTMLDocument()
)创建无浏览上下文的 Document
对象。
将 browsingContext 设置为给定 browsingContext、navigationParams 的最终沙盒标志集、navigationParams 的跨源打开程序策略 和 navigationParams 的COOP 执行结果 的获取用于导航响应的浏览上下文的结果。
这可能导致浏览上下文组切换,在这种情况下,browsingContext 将是一个新创建的浏览上下文,而不是 navigationParams 的可导航对象的活动浏览上下文。在这种情况下,创建的 Window
、Document
和代理 最终将不会被使用;因为创建的 Document
的来源 是不透明的,我们将最终创建新的代理 和 Window
在此算法的后面 以配合新的 Document
。
令 permissionsPolicy 为给定 navigationParams 的可导航对象的容器、navigationParams 的来源 和 navigationParams 的响应 的从响应创建权限策略的结果。[PERMISSIONSPOLICY]
从响应创建权限策略算法使用了传递的来源。如果已将document.domain
用于 navigationParams 的可导航对象的容器文档,则其来源 不能与传递的来源同源,因为这些步骤在创建 document 之前运行,因此它本身尚不能使用document.domain
。请注意,这意味着与执行同源检查相比,权限策略检查的许可性较低。
请参见下面的实际示例。
如果 navigationParams 的请求 不为空,则将 creationURL 设置为 navigationParams 的请求的当前 URL。
令 window 为 null。
如果 browsingContext 的活动文档的是否为初始 about:blank
为 true,并且 browsingContext 的活动文档的来源 与 navigationParams 的来源同源,则将 window 设置为 browsingContext 的活动窗口。
这意味着初始 about:blank
Document
和即将创建的新 Document
将共享相同的 Window
对象。
否则
令 oacHeader 为给定 `Origin-Agent-Cluster
` 和 "item
" 从 navigationParams 的响应的头部列表 的获取结构化字段值的结果。
如果 oacHeader 不为空且 oacHeader[0] 为布尔值 true,则令 requestsOAC 为 true;否则为 false。
如果 navigationParams 的保留环境 为非安全上下文,则将 requestsOAC 设置为 false。
令 agent 为给定 navigationParams 的来源、browsingContext 的组 和 requestsOAC 的获取同源窗口代理的结果。
令 realmExecutionContext 为给定 agent 和以下自定义项的创建新领域的结果
对于全局对象,创建一个新的 Window
对象。
对于全局this绑定,使用 browsingContext 的WindowProxy
对象。
将 window 设置为 realmExecutionContext 的 Realm 组件的全局对象。
令 topLevelCreationURL 为 creationURL。
令 topLevelOrigin 为 navigationParams 的来源。
如果 navigable 的容器 不为空,则
令 parentEnvironment 为 navigable 的容器的相关设置对象。
将 topLevelCreationURL 设置为 parentEnvironment 的顶级创建 URL。
将 topLevelOrigin 设置为 parentEnvironment 的顶级来源。
设置窗口环境设置对象,其中包含 creationURL、realmExecutionContext、navigationParams 的保留环境、topLevelCreationURL 和 topLevelOrigin。
这是常见情况,即我们即将创建的新 Document
会获得一个新的 Window
与之配合。
令 loadTimingInfo 为一个新的文档加载时间信息,其导航开始时间设置为 navigationParams 的响应的时间信息的开始时间。
令 document 为一个新的 Document
,其中包含
loading
"将 window 的 关联的 Document
设置为 document。
给定 document,运行 Document
的 CSP 初始化。 [CSP]
如果 navigationParams 的 请求 不为空,则
如果 navigationParams 的 获取控制器 不为空,则
给定 navigationParams 的 响应 的 计时信息、redirectCount、navigationParams 的 导航计时类型 和 navigationParams 的 响应 的 服务工作线程计时信息,创建 document 的导航计时条目。
如果 navigationParams 的 响应 包含 `Refresh
` 头部,则
令 value 为该头部值的 同构解码。
使用 document 和 value 运行 共享的声明式刷新步骤。
如果 navigationParams 的 提交早期提示 不为空,则使用 document 调用 navigationParams 的 提交早期提示。
给定 document、navigationParams 的 响应 和 "pre-media
",处理链接头部。
返回 document。
在此示例中,子文档不允许使用 PaymentRequest
,即使在子文档尝试使用它时是 同源域。在子文档初始化时,只有父文档设置了 document.domain
,而子文档尚未设置。
<!-- https://foo.example.com/a.html -->
<!doctype html>
< script >
document. domain = 'example.com' ;
</ script >
< iframe src = b.html ></ iframe >
<!-- https://bar.example.com/b.html -->
<!doctype html>
< script >
document. domain = 'example.com' ; // This happens after the document is initialized
new PaymentRequest( …); // Not allowed to use
</ script >
在此示例中,子文档允许使用 PaymentRequest
,即使在子文档尝试使用它时不是 同源域。在子文档初始化时,任何文档都尚未设置 document.domain
,因此 同源域 回退到正常的 同源 检查。
<!-- https://example.com/a.html -->
<!doctype html>
< iframe src = b.html ></ iframe >
<!-- The child document is now initialized, before the script below is run. -->
< script >
document. domain = 'example.com' ;
</ script >
<!-- https://example.com/b.html -->
<!doctype html>
< script >
new PaymentRequest( …); // Allowed to use
</ script >
给定 Document
document,填充 html
/head
/body
给定 导航参数 navigationParams,加载 HTML 文档
令 document 为给定 "html
"、"text/html
" 和 navigationParams 创建和初始化 Document
对象 的结果。
如果 document 的 URL 为 about:blank
,则给定 document 填充 html
/head
/body
。
即使是非 初始 about:blank
Document
也同步获得其元素节点的这个特殊情况,对于与已部署内容的兼容性是必要的。换句话说,改为进入“其他”分支并将空 字节序列 馈送到 HTML 解析器 以异步填充 document 是不兼容的。
否则,创建一个 HTML 解析器 并将其与 document 关联。在获取过程中,网络任务源 放置在 任务队列 上的每个 任务 必须随后用获取的字节填充解析器的 输入字节流,并导致 HTML 解析器 对输入流执行适当的处理。
在获取过程中,网络任务源 放置在 任务队列 上的第一个 任务 必须在任务由 HTML 解析器 处理后,给定 document、navigationParams 的 响应 和 "media
" 处理链接头部。
在任何脚本执行发生之前,用户代理必须等待 脚本可能为新创建的文档运行 对 document 为 true。
输入字节流 将字节转换为字符以供 标记器 使用。此过程部分依赖于在资源的实际 Content-Type 元数据 中找到的字符编码信息;计算的类型不用于此目的。
当不再有字节可用时,用户代理必须在给定 document 的 相关全局对象 的 网络任务源 上 排队一个全局任务,以使解析器处理隐含的 EOF 字符,这最终会导致触发 load
事件。
返回 document。
当需要内联显示 XML 文件时,在提供 导航参数 navigationParams 和字符串 type 的情况下,用户代理必须遵循 XML、XML 命名空间、XML 媒体类型、DOM 及其他相关规范中定义的要求,来 创建并初始化一个 Document
对象 document(给定 "xml
"、type 和 navigationParams),并返回该 Document
。它们还必须创建一个相应的 XML 解析器。 [XML] [XMLNS] [RFC7303] [DOM]
在撰写本文档时,XML 规范社区实际上尚未指定 XML 和 DOM 如何交互。
在获取过程中,网络任务源 放入 任务队列 的第一个 任务 必须 处理链接头,给定 document、navigationParams 的 响应 和 "media
",在该任务由 XML 解析器 处理之后。
在确定字符编码时,必须使用实际的 HTTP 头部和其他元数据,而不是本规范中给出的算法修改或暗示的头部,这些头部必须根据上述规范中给出的规则使用。一旦字符编码确定,则必须将 文档的字符编码 设置为该字符编码。
在任何脚本执行之前,用户代理必须等待 新创建的文档可以运行脚本 对新创建的 Document
为 true。
解析完成后,用户代理必须将 document 的 WebDriver BiDi 的加载中导航 ID 设置为 null。
对于 HTML 文档,这会在解析完成后重置,在触发 load 事件之后。
解析过程中的错误消息(例如,XML 命名空间格式良好的错误)可以通过修改 Document
来内联报告。
要 加载文本文档,给定 导航参数 navigationParams 和字符串 type
令 document 为 创建并初始化一个 Document
对象 的结果,给定 "html
"、type 和 navigationParams。
将 document 的 解析器无法更改模式标志 设置为 true。
将 document 的 模式 设置为 "no-quirks
"。
创建一个 HTML 解析器 并将其与 document 关联。假定标记器已发出一个开始标记令牌,其标记名称为 "pre",后跟一个 U+000A 换行符 (LF) 字符,并将 HTML 解析器 的标记器切换到 纯文本状态。然后,网络任务源 在获取过程中放入 任务队列 的每个 任务 必须使用获取的字节填充解析器的 输入字节流,并导致 HTML 解析器 对输入流执行相应的处理。
document 的 编码 必须设置为在解析过程中用于解码文档的字符编码。
在获取过程中,网络任务源 放入 任务队列 的第一个 任务 必须 处理链接头,给定 document、navigationParams 的 响应 和 "media
",在该任务由 HTML 解析器 处理之后。
在任何脚本执行之前,用户代理必须等待 新创建的文档可以运行脚本 对 document 为 true。
当没有更多字节可用时,用户代理必须在 网络任务源 上 排队一个全局任务,给定 document 的 相关全局对象,以便解析器处理隐含的 EOF 字符,这最终会导致触发 load
事件。
用户代理可以向 document 的 head
元素添加内容,例如,链接到样式表、提供脚本或为文档提供 标题
。
特别是,如果用户代理支持 RFC 3676 的 Format=Flowed
功能,则用户代理需要应用额外的样式以使文本正确换行并处理引用功能。这可以使用例如 CSS 扩展来执行。
返回 document。
如何将纯文本文档的字节转换为实际字符的规则,以及如何实际将文本呈现给用户的规则,由资源的 计算出的 MIME 类型(即 type)的规范定义。
multipart/x-mixed-replace
文档要 加载 multipart/x-mixed-replace
文档,给定 导航参数 navigationParams、源快照参数 sourceSnapshotParams 和 源 initiatorOrigin
令 firstPartNavigationParams 为 navigationParams 的副本。
将 firstPartNavigationParams 的 响应 设置为一个新的 响应,表示 navigationParams 的 响应 的 主体 的多部分流的第一部分。
令 document 为 加载文档 的结果,给定 firstPartNavigationParams、sourceSnapshotParams 和 initiatorOrigin。
对于从 navigationParams 的 响应 获得的每个附加主体部分,用户代理必须 导航 document 的 节点可导航 到 navigationParams 的 请求 的 URL,使用 document,其中 响应 设置为 navigationParams 的 响应,并且 历史处理 设置为 "替换
"。
返回 document。
为了算法处理这些主体部分,就好像它们是完整的独立资源一样,用户代理必须在每次到达主体部分后面的边界时,都假定没有更多字节可用于这些资源。
因此,对于加载的每个主体部分,都会触发 load
事件(以及就此而言的 unload
事件)。
要 加载媒体文档,给定 navigationParams 和字符串 type
令 document 为 创建并初始化一个 Document
对象 的结果,给定 "html
"、type 和 navigationParams。
将 document 的 模式 设置为 "no-quirks
"。
使用 html
/head
/body
填充,给定 document。
将媒体的元素 主机元素(如下所述)附加到 body
元素。
将元素 主机元素 的适当属性(如下所述)设置为图像、视频或音频资源的地址。
用户代理可以向 document 的 head
元素或 主机元素 的属性添加内容,例如,链接到样式表、提供脚本、为文档提供 标题
或使媒体 自动播放。
处理链接头,给定 document、navigationParams 的 响应 和 "media
"。
假定用户代理已 停止解析 document。
返回 document。
要为媒体创建的元素 主机元素 是下表中第一列描述媒体的行中第二列给出的元素。要设置的适当属性是同一行中第三列给出的属性。
媒体类型 | 媒体的元素 | 适当的属性 |
---|---|---|
图像 | img
| src
|
视频 | video
| src
|
音频 | audio
| src
|
在任何脚本执行之前,用户代理必须等待 新创建的文档可以运行脚本 对 Document
为 true。
当用户代理要创建文档以内联显示用户代理页面或 PDF 查看器时,在提供 可导航 navigable、导航 ID navigationId、NavigationTimingType
navTimingType 的情况下,用户代理应
令 origin 为一个新的 不透明源。
令 coop 为一个新的 打开程序策略。
令 coopEnforcementResult 为一个新的 打开程序策略执行结果,其中包含
令 navigationParams 为一个新的 导航参数,其中包含
令 document 为 创建并初始化一个 Document
对象 的结果,给定 "html
"、"text/html
" 和 navigationParams。
要么将 document 与自定义渲染相关联(不使用正常的 Document
渲染规则进行渲染),要么修改 document,直到它表示用户代理想要渲染的内容。
返回 document。
因为我们确保生成的Document
的源为不透明,并且生成的Document
无法运行访问DOM的脚本,因此Web开发者代码无法观察到此Document
的存在及其属性。这意味着大多数上述值(例如,text/html
的类型)并不重要。类似地,navigationParams中的大多数项都没有任何可观察到的效果,除了防止Document
创建算法出现混淆,因此将其设置为默认值。
页面设置完成后,用户代理必须表现得好像它已经停止解析。
一个Document
有一个完全加载时间(一个时间或null),最初为null。
如果Document
的完全加载时间不为null,则认为该Document
已完全加载。
要完全完成加载一个Document
document
将document的完全加载时间设置为当前时间。
如果container是
元素,则在给定container的DOM操作任务源上将一个元素任务排队,以运行给定container的iframe加载事件步骤。iframe
否则,如果container不为null,则在给定container的DOM操作任务源上将一个元素任务排队,以触发名为
的事件,目标为container。load
一个Document
具有可挽救状态,最初必须为true,以及一个页面显示标志,最初必须为false。页面显示标志用于确保脚本以一致的方式接收
和pageshow
事件(例如,它们永远不会在没有中间的pagehide
的情况下连续接收两个pageshow
事件,反之亦然)。pagehide
一个Document
有一个
挂起时间,最初为0。DOMHighResTimeStamp
一个Document
有一个列表的挂起的计时器句柄,最初为空。
事件循环有一个终止嵌套级别计数器,最初必须为0。
Document
对象有一个卸载计数器,用于在以下算法运行时忽略某些操作。最初,计数器必须设置为零。
要卸载一个Document
oldDocument,给定一个可选的Document
newDocument
令unloadTimingInfo为一个新的文档卸载时间信息。
如果未给出newDocument,则将unloadTimingInfo设置为null。
在这种情况下,没有新的文档需要知道oldDocument卸载花费了多长时间。
否则,如果newDocument的事件循环不是oldDocument的事件循环,则用户代理可能正在并行卸载oldDocument。在这种情况下,用户代理应该将unloadTimingInfo设置为null。
在这种情况下,newDocument的加载不受卸载oldDocument所需时间的影響,因此传达该时间信息毫无意义。
令intendToKeepInBfcache为true,如果用户代理打算在会话历史记录条目中保持oldDocument处于活动状态,以便稍后可用于历史记录遍历。
如果oldDocument不是可挽救的,或者如果oldDocument的任何后代用户代理都不打算以相同的方式保持活动状态(包括由于它们缺乏可挽救性),则此值必须为false。
令eventLoop为oldDocument的相关代理的事件循环。
将eventLoop的终止嵌套级别增加1。
将oldDocument的卸载计数器增加1。
如果intendToKeepInBfcache为false,则将oldDocument的可挽救状态设置为false。
如果oldDocument的页面显示为true
如果unloadTimingInfo不为null,则将unloadTimingInfo的卸载事件开始时间设置为给定newDocument的相关全局对象的当前高分辨率时间,粗化,给定oldDocument的相关设置对象的跨源隔离功能。
如果oldDocument的可挽救状态为false,则触发名为
的事件,目标为oldDocument的相关全局对象,并设置旧版目标覆盖标志。unload
如果unloadTimingInfo不为null,则将unloadTimingInfo的卸载事件结束时间设置为给定newDocument的相关全局对象的当前高分辨率时间,粗化,给定oldDocument的相关设置对象的跨源隔离功能。
将eventLoop的终止嵌套级别减少1。
将oldDocument的已被用户滚动设置为false。
如果oldDocument的节点可导航是顶级可遍历,则为顶级可遍历及其后代构建未恢复的原因,给定oldDocument的节点可导航。
将oldDocument的卸载计数器减少1。
如果给定newDocument,newDocument的通过跨源重定向创建为false,并且newDocument的源与oldDocument的源相同,则将newDocument的前一个文档卸载时间设置为unloadTimingInfo。
要卸载文档及其后代,给定一个Document
document,一个可选的Document
或null newDocument(默认为null),一个可选的步骤集afterAllUnloads,以及一个可选的步骤集firePageSwapSteps
断言:这是在document的节点可导航的可遍历可导航的会话历史记录遍历队列中运行的。
令childNavigables为document的子可导航。
令numberUnloaded为0。
对于每个 childNavigable 的 childNavigable 的 按什么顺序?,在给定 childNavigable 的 活动窗口 的 导航和遍历任务源 上排队一个全局任务,以执行以下步骤
等待直到 numberUnloaded 等于 childNavigable 的 大小。
在给定 document 的 相关全局对象 的 导航和遍历任务源 上排队一个全局任务,以执行以下步骤
如果给定了 firePageSwapSteps,则运行 firePageSwapSteps。
卸载 document,如果 newDocument 不为 null,则将其传递。
如果给定了 afterAllUnloads,则运行它。
本规范定义了以下 卸载文档清理步骤。其他规范可以定义更多。给定一个 Document
document
令 window 为 document 的 相关全局对象。
对于每个其 相关全局对象 为 window 的 WebSocket
对象 webSocket,使消失 webSocket。
对于每个其 相关全局对象 为 window 的 WebTransport
对象 transport,运行给定 transport 的 上下文清理步骤。
如果 document 的 可恢复 状态为 false,则
对于每个其 相关全局对象 等于 window 的 EventSource
对象 eventSource,强制关闭 eventSource。
清除 window 的 活动计时器映射。
如果规范作者发送一个拉取请求,直接从这里添加调用到他们的规范中,而不是使用 卸载文档清理步骤 钩子,以确保定义良好的跨规范调用顺序,将会更好。在撰写本文时,已知以下规范具有 卸载文档清理步骤,这些步骤将以未指定的顺序运行:全屏 API、Web NFC、WebDriver BiDi、计算压力、文件 API、媒体捕获和流、画中画、屏幕方向、服务工作者、WebLocks API、WebAudio API、WebRTC。 [FULLSCREEN] [WEBNFC] [WEBDRIVERBIDI] [COMPUTEPRESSURE] [FILEAPI] [MEDIASTREAM] [PICTUREINPICTURE] [SCREENORIENTATION] [SW] [WEBLOCKS] [WEBAUDIO] [WEBRTC]
问题 #8906 跟踪使这些步骤的顺序明确的工作。
要 销毁 一个 Document
document
中止 document。
将 document 的 可恢复 状态设置为 false。
令 ports 为其 相关全局对象 的 关联的 Document
为 document 的 MessagePort
列表。
对于 ports 中的每个 port,分离 port。
从任何 任务队列 中删除任何其 文档 为 document 的 任务(无需运行这些任务)。
将 document 的 浏览上下文 设置为 null。
移除 document 来自每个其集合 包含 document 的 WorkerGlobalScope
对象的 所有者集。
对于每个 document 的 工作线程全局范围 中的 workletGlobalScope,终止 workletGlobalScope。
即使在销毁后,Document
对象本身也可能仍然可以通过脚本访问,在我们要 销毁子可导航 的情况下。
要 销毁文档及其后代,给定一个 Document
document 和一个可选的步骤集 afterAllDestruction,执行以下步骤 并行
如果 document 不是 完全活动,则
令 childNavigables 为 document 的 子可导航。
令 numberDestroyed 为 0。
对于每个 childNavigable 的 childNavigable 的 按什么顺序?,在给定 childNavigable 的 活动窗口 的 导航和遍历任务源 上排队一个全局任务,以执行以下步骤
等待直到 numberDestroyed 等于 childNavigable 的 大小。
在给定 document 的 相关全局对象 的 导航和遍历任务源 上排队一个全局任务,以执行以下步骤
销毁 document。
如果给定了 afterAllDestruction,则运行它。
要 中止 一个 Document
document
取消 document 上下文中 获取 算法的任何实例,丢弃为它们排队的任何 任务,并丢弃从网络为它们接收的任何其他数据。如果这导致了 获取 算法的任何实例被取消或任何排队的 任务或任何网络数据被丢弃,则给定 document 和 "获取
" 使文档无法恢复。
如果 document 的 用于 WebDriver BiDi 的加载期间导航 ID 不为 null,则
使用 document 的 浏览上下文 和一个新的 WebDriver BiDi 导航已中止,以及一个新的 WebDriver BiDi 导航状态,其 id 为 document 的 用于 WebDriver BiDi 的加载期间导航 ID,状态 为 "已取消
",以及 url 为 document 的 URL。
将 document 的 用于 WebDriver BiDi 的加载期间导航 ID 设置为 null。
如果 document 有一个 活动解析器,则
要 中止文档及其后代,给定一个 Document
document
令 descendantNavigables 为 document 的 后代可导航对象。
对于 descendantNavigables 中的每个 descendantNavigable 以什么顺序?,在 descendantNavigable 的 活动窗口 上的 导航和遍历任务源 上排队一个全局任务,以执行以下步骤
中止 document。
要 停止加载 可导航对象 navigable
令 document 为 navigable 的 活动文档。
如果 document 的 卸载计数器 为 0,并且 navigable 的 正在进行的导航 为 导航 ID,则 将 navigable 的正在进行的导航 设置为 null。
这将导致中止 navigable 的任何正在进行的导航,因为在导航期间的某些点,对 正在进行的导航 的更改将导致进一步的工作被放弃。
中止文档及其后代,给定 document。
通过其 用户界面,用户代理还允许停止遍历,即 正在进行的导航 为“traversal
”的情况。上述算法没有考虑这种情况。(另一方面,用户代理不允许 window.stop()
停止遍历,因此上述算法对于该调用者是正确的。)请参阅 问题 #6905。
X-Frame-Options
` 标头所有当前引擎都支持。
`X-Frame-Options
` HTTP 响应标头是控制 Document
是否以及如何加载到 子可导航对象 中的传统方法。它已被 frame-ancestors
CSP 指令弃用,该指令提供了对相同情况的更细粒度的控制。它最初在 HTTP 标头字段 X-Frame-Options 中定义,但此处的定义取代了该文档。 [CSP] [RFC7034]
特别是,HTTP 标头字段 X-Frame-Options 指定了标头的 `ALLOW-FROM
` 变体,但不应实现该变体。
如果在同一个 响应 中同时使用了 CSP frame-ancestors
指令和 `X-Frame-Options
` 标头,则忽略 `X-Frame-Options
`。
对于 Web 开发人员和一致性检查器,其值 ABNF 为
X-Frame-Options = "DENY" / "SAMEORIGIN"
下表说明了对标头的各种值的处理,包括不符合标准的值
`X-Frame-Options ` | 有效 | 结果 |
---|---|---|
`DENY ` | ✅ | 不允许嵌入 |
`SAMEORIGIN ` | ✅ | 允许同源嵌入 |
`INVALID ` | ❌ | 允许嵌入 |
`ALLOWALL ` | ❌ | 允许嵌入 |
`ALLOW-FROM=https://example.com/ ` | ❌ | 允许嵌入(来自任何地方) |
下表说明了如何处理涉及多个值的各种不符合标准的情况
`X-Frame-Options ` | 结果 |
---|---|
`SAMEORIGIN, SAMEORIGIN ` | 允许同源嵌入 |
`SAMEORIGIN, DENY ` | 不允许嵌入 |
`SAMEORIGIN, ` | 不允许嵌入 |
`SAMEORIGIN, ALLOWALL ` | 不允许嵌入 |
`SAMEORIGIN, INVALID ` | 不允许嵌入 |
`ALLOWALL, INVALID ` | 不允许嵌入 |
`ALLOWALL, ` | 不允许嵌入 |
`INVALID, INVALID ` | 允许嵌入 |
无论值是通过单个标头(其值为逗号分隔)还是通过多个标头传递,都会获得相同的结果。
Refresh
` 标头`Refresh
` HTTP 响应标头等效于 meta
元素,该元素在 刷新状态 中具有 http-equiv
属性。它采用 相同的值 并且在很大程度上工作方式相同。
浏览器用户代理应提供 导航、重新加载 和 停止加载其 顶级可遍历对象集 中的任何 顶级可遍历对象 的能力。
例如,通过位置栏和重新加载/停止按钮 UI。
浏览器用户代理应提供 按增量遍历其 顶级可遍历对象集 中的任何 顶级可遍历对象 的能力。
例如,通过后退和前进按钮,可能包括长按功能以更改增量。
建议此类用户代理允许按大于 1 的增量进行遍历,以避免页面通过填充会话历史记录中的虚假条目来“困住”用户。(例如,通过重复调用 history.pushState()
或 片段导航。)
某些用户代理具有启发式方法,用于将单个“后退”或“前进”按钮按下转换为更大的增量,特别是为了克服此类滥用。我们正在考虑在 问题 #7832 中指定这些启发式方法。
浏览器用户代理应为用户提供 创建新的顶级可遍历对象的能力,给定用户提供的或用户代理确定的初始 URL。
例如,通过“新建标签页”或“新建窗口”按钮。
浏览器用户代理应为用户提供任意 关闭其 顶级可遍历对象集 中的任何 顶级可遍历对象 的能力。
例如,通过单击“关闭标签页”按钮。
浏览器用户代理可以提供方法,让用户显式地导致任何 可导航对象(不仅仅是 顶级可遍历对象)导航、重新加载或 停止加载。
例如,通过上下文菜单。
浏览器用户代理可以提供功能,让用户 销毁顶级可遍历对象。
例如,通过强制关闭包含一个或多个此类 顶级可遍历对象 的窗口。
当用户请求 重新加载 可导航对象 时,其 活动会话历史记录条目 的 文档状态 的 资源 为 POST 资源,用户代理应先提示用户确认操作,否则可能会重复事务(例如,购买或数据库修改)。
当用户请求 重新加载 可导航对象 时,用户代理可以提供一种机制,用于在重新加载时忽略任何缓存。
由上述机制发起的对 导航 的所有调用都必须将 userInvolvement 参数设置为“浏览器 UI
”。
由上述机制发起的对 重新加载 的所有调用都必须将 userInvolvement 参数设置为“浏览器 UI
”。
由上述机制发起的对 按增量遍历历史记录 的所有调用都不得为 sourceDocument 参数传递值。
以上建议以及本规范中的数据结构,并非意在限制用户代理向用户展示会话历史的方式。
例如,尽管顶级可遍历对象的会话历史条目被存储和维护为列表,并且建议用户代理提供一个通过增量遍历该列表的接口,但新颖的用户代理也可以额外或替代地提供树状视图,其中每个页面都有多个可供用户选择的“前进”页面。
类似地,尽管所有后代可导航对象的会话历史都存储在其可遍历可导航对象中,但用户代理可以向用户提供更细致的每个可导航对象的会话历史视图。
浏览器用户代理可以使用顶级浏览上下文的is popup布尔值用于以下目的
在这两种情况下,用户代理还可以额外纳入用户偏好,或提供是否采用弹出窗口方式的选择。
为这些弹出窗口提供最小用户界面的用户代理,建议不要隐藏浏览器的地址栏。