Speculation Rules API

Speculation Rules API 设计以用于支持改善导航的性能,通过允许指定一系列规则以实现对未来文档资源的预加载

它主要用于增强和改进 <link rel="prefetch"> 的功能以及替代仅由 Chrome 支持的 <link rel="prerender"> 非标准弃用特性,通过提供可配置的语法实现

特别注意的是,它仅支持文档资源的加载,不支持子资源的加载,那种情况下应当使用 <link rel="prefetch">

Speculation Rules 语法

Speculation Rules 通过 <script type="speculationrules"> 指定,支持 JSON 格式的语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script type="speculationrules">
{
"prerender": [
{
"source": "list",
"urls": ["extra.html", "extra2.html"]
}
],
"prefetch": [
{
"source": "list",
"urls": ["next.html", "next2.html"],
"requires": ["anonymous-client-ip-when-cross-origin"],
"referrer_policy": "no-referrer"
}
]
}
</script>

需要注意的是,<script> 标签的 src async nomodule defer crossorigin integrityreferrerpolicy 等属性不应当指定

整个 JSON 为一个对象,分别可以指定 prefetch 键和 prerender 键,均接收一个对象数组,分别代表提前获取文档资源及提前获取并加载渲染文档资源的规则

规则对象需指定 source 键,代表指定当前规则的模式,目前唯一允许的值为 list,表示 URL 将来自一组列表

规则对象需指定 urls 键,接收一个字符串数组,代表需要加载的资源 URL 的列表(相对路径觉得路径均可)

规则对象可以指定 requires 键,代表指定解析规则的要求,目前唯一允许的值为 anonymous-client-ip-when-cross-origin,仅适用于 prefetch 场景,表示规则是否匹配与用户代理能否在跨域请求中避免向远程服务器暴露本地用户的 IP 地址

规则对象可以指定 referrer_policy 键,代表获取资源时使用的 referrer policy,允许的值同 Referrer-Policy

prefetch 与 prerender 比较

prefetch 允许提前获取文档资源并缓存

prefetch 相较于 <link rel="prefetch"> 可用于加载跨域页面且不受 Cache-Control 头影响

prerender 允许提前获取文档资源并进行预渲染,包括获取并加载所有子资源,执行 JavaScript 以及获取及加载由 JavaScript 执行产生的子资源,绝大多数 API 会延迟执行直至页面被激活

跨域的 prerender 要求文档资源的 Supports-Loading-Mode 响应头设定为 credentialed-prerender 以允许执行预加载

prerender 相较于 <link rel="prerender"> 可用于加载跨域页面且不受 Cache-Control 头影响,并且其是标准且将得到未来大多数浏览器的支持,该特性是否有效受用户代理的设定的影响

prefetch 与 prerender 检测

服务端可通过 Sec-Purpose 请求头检测请求的文档是否为 prefetch 或 prerender

对于 prefetch 而言:

1
Sec-Purpose: prefetch

对于 prerender 而言:

1
Sec-Purpose: prefetch;prerender

可以通过返回非 200 状态码和 304 状态码的响应来阻止 prefetch 或 prerender

客户端可分别利用 PerformanceResourceTiming 接口的 deliveryType 属性 或 Document 接口的 prerendering 属性检测

DOM 相关

Document 接口的 prerendering 属性返回一个 boolean,表示当前文档是否在预渲染进程中

Document 接口的 prerenderingchange 事件在预渲染文档被激活时触发(如用户访问当前文档),返回一个 Event

HTTP 相关

Supports-Loading-Mode 响应头允许启用多个高风险的加载模式

目前仅支持值 credentialed-prerender 以允许跨域同站的预渲染模式

Content Security Policy 相关

允许在 Content Security Policy 中使用 inline-speculation-rules 值,以限制 <script type="speculationrules"> 的使用以控制资源加载

链接

View Transitions API

View Transitions API 提供了创建视图过渡的功能

目前该 API 仅支持在单 Document 中的视图过渡,尚未支持跨 Document 的视图过渡

视图过渡进程

  1. 调用 Document 接口上的 startViewTransition() 方法
  2. 截取当前 DOM 的截图以作为视图过渡前的 old 状态
  3. 暂停 DOM 的渲染
  4. updateCallback 回调函数参数,若提供的话会被调用
  5. ViewTransition 接口的 updateCallbackDone 属性对应的 Promise 兑现
  6. 截取当前 DOM 的截图以作为视图过渡后的 new 状态
  7. 创建各视图过渡伪元素
  8. 重启 DOM 的渲染以渲染各视图过渡伪元素
  9. ViewTransition 接口的 ready 属性对应的 Promise 兑现
  10. 各视图过渡伪元素开始执行动画直至结束
  11. 移除各视图过渡伪元素
  12. ViewTransition 接口的 finished 属性对应的 Promise 兑现

视图过渡结构

通常情况下,视图过渡有关的伪元素的结构如下所示

Text
1
2
3
4
5
::view-transition
└─ ::view-transition-group(root)
└─ ::view-transition-image-pair(root)
├─ ::view-transition-old(root)
└─ ::view-transition-new(root)

可以通过指定 view-transition-name 属性来应用给定的动画

1
2
3
figcaption {
view-transition-name: figure-caption;
}

此时视图过渡有关的伪元素的结构如下所示

Text
1
2
3
4
5
6
7
8
9
::view-transition
├─ ::view-transition-group(root)
│ └─ ::view-transition-image-pair(root)
│ ├─ ::view-transition-old(root)
│ └─ ::view-transition-new(root)
└─ ::view-transition-group(figure-caption)
└─ ::view-transition-image-pair(figure-caption)
├─ ::view-transition-old(figure-caption)
└─ ::view-transition-new(figure-caption)

API 相关

Document 接口的 startViewTransition() 方法用于创建视图过渡

方法接收一个可选的 updateCallback 回调函数参数,该回调函数允许返回一个 Promise

方法返回一个 ViewTransition 实例

ViewTransition 接口反映了一个视图过渡

ViewTransition 接口的 finished 属性返回一个 Promise,在视图过渡完成并且视图过渡伪元素完全移除时兑现,若 updateCallback 回调函数返回的 Promise 拒绝时拒绝

ViewTransition 接口的 ready 属性返回一个 Promise,在视图过渡伪元素完成创建并且视图过渡将要开始时兑现,若 updateCallback 回调函数返回的 Promise 拒绝时或出现重复 view-transition-name 名称时拒绝

ViewTransition 接口的 updateCallbackDone 属性返回一个 Promise,在 updateCallback 回调函数返回的 Promise 兑现时兑现,拒绝时拒绝

ViewTransition 接口的 skipTransition() 方法可用于忽略执行视图过渡,但不会忽略执行传入的 updateCallback 回调函数参数

CSS 相关

view-transition-name 属性指定为 none 以使当前元素不应用视图过渡

该属性的值在整个文档中必须唯一,不同元素不能拥有相同的值,否则视图过渡会被忽略

::view-transition 伪元素选择器作为视图过渡遮蔽层的根元素,包含其他视图过渡组(包含多个 ::view-transition-group 伪元素)

::view-transition-group 伪元素选择器表示单个视图过渡组,可以接收 * root 或一个视图过渡组名称(包含单个 ::view-transition-image-pair 伪元素)

::view-transition-image-pair 伪元素选择器代表单个视图过渡的视图截图容器,允许值同上

::view-transition-new 伪元素选择器代表单个视图过渡新的视图截图,允许值同上

::view-transition-old 伪元素选择器代表单个视图过渡旧的视图截图,允许值同上

示例

0 0 0 0 0 0 0 0 0

类型

1
2
3
4
5
6
7
8
9
10
11
12
interface Document {
startViewTransition(updateCallback?: UpdateCallback): ViewTransition
}

type UpdateCallback = () => Promise<any>

interface ViewTransition {
readonly updateCallbackDone: Promise<undefined>
readonly ready: Promise<undefined>
readonly finished: Promise<undefined>
skipTransition(): void
}

链接

Content Security Policy

Content Security Policy 简称 CSP,可用于应对跨站脚本攻击(XSS 攻击)及数据包嗅探攻击

在不指定 Content Security Policy 的情况下,浏览器会使用默认的同源策略

Content Security Policy 语法

通常是通过 Content-Security-Policy 响应头指定

1
Content-Security-Policy: <policy>

或者通过 <meta> 标签指定

1
<meta http-equiv="Content-Security-Policy" content="<policy>" />

使用 Content-Security-Policy-Report-Only 响应头可以指定仅报告但不阻碍执行的规则,该响应头需要与 report-to 指定同时使用,并且该响应头会继承 Content-Security-Policy 响应头的规则(除 sandbox 之外)

Content Security Policy 指令

Directive name Directive description
default-src 作为其他 fetch 相关指令的来源的后备值
child-src 限制 Worker 脚本资源和内嵌浏览上下文来源
worker-src 限制 Worker 脚本资源来源
frame-src 限制内嵌浏览上下文来源
script-src 限制 JavaScript 脚本和 WebAssembly 来源
script-src-elem 限制 JavaScript 的 <script> 标签来源
script-src-attr 限制 JavaScript 脚本在行内事件回调方法来源
style-src 限制样式表来源
style-src-elem 限制样式表在 <style> 标签和 <link rel="stylesheet"> 来源
style-src-attr 限制样式表在内联样式中来源
manifest-src 限制应用 manifest 文件来源
img-src 限制 image 和 favicon 来源
media-src 限制 <audio> <video> <track> 的媒体资源来源
object-src 限制 <object> <embed> 的资源来源
font-src 限制 @font-face 加载的字体资源来源
connect-src 限制脚本加载的资源来源
base-uri 限制 <base> 标签的内容
sandbox 设置沙箱策略(类似 <iframe> 标签的 sandbox 属性)
form-action 限制表单提交后允许的提交目标
frame-ancestors 限制允许内嵌 <frame> <iframe> <object> <embed> 的浏览上下文
report-to 允许在违反 CSP 事件发生时向指定源发送报告
require-trusted-types-for 强制使用 Trusted Types 应对 XSS 攻击
trusted-types 指定 Trusted Types 的允许指令列表
upgrade-insecure-requests 强制将不安全链接升级为安全链接对待

Content Security Policy 值

Value name Value description
none 不允许任何源的资源
self 允许当前源的资源
strict-dynamic 限制当前资源的规则应同时适用于其加载的资源
report-sample 要求在报告中包含样例代码
inline-speculation-rules 允许使用 speculation rules 脚本规则
unsafe-eval 允许使用 eval 等动态执行代码方法
wasm-unsafe-eval 允许使用加载执行 WebAssembly 模块(避免直接指定 unsafe-eval
unsafe-hashes 允许使用特定的内联事件处理方法
unsafe-inline 允许使用内联资源
nonce-<base64-value> 允许 nonce 属性指定的标识符限制的资源
<hash-algorithm>-<base64-value> 允许指定哈希算法(sha256 sha384 sha512)生成的标识符限制的资源
<host-source> 允许给定的域的资源
<scheme-source> 允许给定协议的资源

Content Security Policy 示例

1
2
3
4
5
Content-Security-Policy: default-src 'self'
Content-Security-Policy: default-src 'self' example.com *.example.com
Content-Security-Policy: default-src 'self'; img-src *; media-src example.org example.net; script-src userscripts.example.com
Content-Security-Policy: default-src https://onlinebanking.example.com
Content-Security-Policy: default-src 'self' *.example.com; img-src *

链接

Visual Viewport API

Visual Viewport API 提供了查询和监测屏幕可视区域的功能

该 API 通过 Window 接口的 visualViewport 属性暴露的 VisualViewport 实例使用

VisualViewport 概念

Viewport 有两个相对的概念 —— Layout Viewport 和 Visual Viewport,Layout Viewport 包含当前文档用户可见的内容,而 Visual Viewport 仅包含当前文档用户当前可见的内容。例如,屏幕键盘等功能仅影响 Visual Viewport,不影响 Layout Viewport;缩放页面时,Visual Viewport 发生变化,而 Layout Viewport 不变

获取 VisualViewport 信息

主要通过 VisualViewport 接口的属性获取 Visual Viewport 信息

VisualViewport 接口的 width 属性返回一个 number,表示 Visual Viewport 的宽度

VisualViewport 接口的 height 属性返回一个 number,表示 Visual Viewport 的高度

VisualViewport 接口的 offsetLeft 属性返回一个 number,表示 Visual Viewport 相对 Layout Viewport 左边缘的偏移量

VisualViewport 接口的 offsetTop 属性返回一个 number,表示 Visual Viewport 相对 Layout Viewport 上边缘的偏移量

VisualViewport 接口的 pageLeft 属性返回一个 number,表示 Visual Viewport 相对初始包含块的 x 坐标

VisualViewport 接口的 pageTop 属性返回一个 number,表示 Visual Viewport 相对初始包含块的 y 坐标

VisualViewport 接口的 resize 属性返回一个 number,表示 Visual Viewport 的缩放参数

监听 VisualViewport 变化

主要通过 VisualViewport 接口的事件监听 Visual Viewport 变化

VisualViewport 接口的 resize 事件在 Visual Viewport 尺寸发生改变时触发

VisualViewport 接口的 scroll 事件在 Visual Viewport 发生滚动时触发

示例

Width Height OffsetLeft OffsetTop PageLeft PageTop Scale
0 0 0 0 0 0 0

类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
interface Window {
readonly visualViewport: VisualViewport
}

interface VisualViewport extends EventTarget {
readonly offsetLeft: number
readonly offsetTop: number

readonly pageLeft: number
readonly pageTop: number

readonly width: number
readonly height: number

readonly scale: number

onresize: ((this: VisualViewport, ev: Event) => any) | null
onscroll: ((this: VisualViewport, ev: Event) => any) | null
onscrollend: ((this: VisualViewport, ev: Event) => any) | null
}

链接

Screen API

Screen API 主要支持获取当前设备屏幕的一些信息

该 API 通过 Window 接口的 screen 属性暴露的 Screen 实例使用

屏幕信息

Screen 接口的 height 属性返回一个 number,代表屏幕的高度

Screen 接口的 width 属性返回一个 number,代表屏幕的宽度

Screen 接口的 availHeight 属性返回一个 number,代表屏幕可用区域的高度

Screen 接口的 availWidth 属性返回一个 number,代表屏幕可用区域的宽度

Screen 接口的 colorDepth 属性返回一个 number,代表屏幕的颜色位深度

Screen 接口的 pixelDepth 属性返回一个 number,代表屏幕的像素位深度

类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface Window {
readonly screen: Screen
}

interface Screen {
readonly availHeight: number
readonly availWidth: number
readonly colorDepth: number
readonly height: number
readonly pixelDepth: number
readonly width: number
}

declare var Screen: {
prototype: Screen
}

链接

Permissions Policy

Permissions Policy 允许开发者定义在网页中控制功能的可用性,从而增加应用的安全性和隐私性

Permissions Policy 与 Content Security Policy 类似,但其专注于控制功能特性而非内容

需要注意的是 Permissions Policy 曾经被称为 Feature Policy,但其现在已重命名

指定 Permissions Policy

可以利用 Permissions-Policy 请求头来指定 Permissions Policy,或使用与之等价的 <meta> 标签

可以利用 <iframe> 标签的 allow 属性给内嵌网页指定 Permissions Policy

指定单个 Permissions Policy 时通常包含与之对应的一条指令与允许列表

检测 Permissions Policy

可以通过 Document 接口的 featurePolicy 属性或 HTMLIFrameElement 接口的 featurePolicy 属性暴露的 FeaturePolicy 实例检测 Permissions Policy 的状态

注意:标准已将 FeaturePolicy 接口重命名为 PermissionsPolicy 接口, featurePolicy 属性重命名为 permissionsPolicy 属性

FeaturePolicy 接口的 allowedFeatures() 方法获取当前用户代理在当前浏览上下文允许使用的所有特性

FeaturePolicy 接口的 allowsFeature() 方法检测指定特性在指定的域下是否可用

FeaturePolicy 接口的 features() 方法获取当前用户代理支持的所有特性

FeaturePolicy 接口的 allowedFeatures() 方法列举当前用户代理设置的特性策略中指定特性允许使用的域

Permissions Policy 与 Permissions API 的联系

Permissions Policy 允许开发者设置权限的策略,而 Permissions API 允许用户授予权限

Permissions Policy 指令

Directive name Directive description
accelerometer Accelerometer
ambient-light-sensor AmbientLightSensor
autoplay HTMLMediaElement.play() <audio> & <video> autoplay
battery Battery Status API - Navigator.getBattery()
camera video input devices MediaDevices.getUserMedia()
display-capture MediaDevices.getDisplayMedia()
document-domain set document.domain
encrypted-media Encrypted Media Extensions API - Navigator.requestMediaKeySystemAccess()
execution-while-not-rendered script execution of renderer status
execution-while-out-of-viewport script execution of viewport status
fullscreen Element.requestFullscreen()
gamepad Gamepad API - Navigator.getGamepads() Window:gamepadconnected Window:gamepaddisconnected
geolocation Geolocation API - Geolocation.getCurrentPosition() Geolocation.watchPosition()
gyroscope Gyroscope
hid WebHID API
identity-credentials-get FedCM API
idle-detection Idle Detection API
local-fonts Local Font Access API - Window.queryLocalFonts()
magnetometer Magnetometer
microphone audio input devices MediaDevices.getUserMedia()
midi Web MIDI API - Navigator.requestMIDIAccess()
otp-credentials WebOTP API
payment Payment Request API - PaymentRequest
picture-in-picture Picture In Picture API
publickey-credentials-create Web Authentication API
publickey-credentials-get Web Authentication API
screen-wake-lock Screen Wake Lock API
serial Web Serial API
speaker-selection Audio Output Devices API
storage-access Storage Access API
usb WebUSB API
web-share Web Share API - Navigator.share()
window-management Window Management API
xr-spatial-tracking WebXR Device API

Permissions Policy 允许列表

  • * 允许在顶层浏览上下文及其嵌入浏览上下文中使用
  • () 禁止在顶层浏览上下文及其嵌入浏览上下文中使用,在 <iframe> 标签的 allow 属性的值为 none
  • self 允许在顶层浏览上下文及其同源的嵌入浏览上下文中使用,禁止在嵌入的跨域的嵌入浏览上下文中使用
  • src 仅限在 <iframe> 标签的 allow 属性中使用,允许在当前嵌入浏览上下文中使用
  • <origin> 允许在指定源的浏览上下文中使用
1
2
3
4
5
6
7
8
9
*
()
(self)
(src)
("https://a.example.com")
("https://a.example.com" "https://b.example.com")
(self "https://a.example.com" "https://b.example.com")
(src "https://a.example.com" "https://b.example.com")
("https://*.example.com")

Permissions-Policy 响应头语法

基本语法

1
Permissions-Policy: <directive>=<allowlist>

示例

1
2
3
Permissions-Policy: geolocation=()
Permissions-Policy: geolocation=(self "https://a.example.com" "https://b.example.com")
Permissions-Policy: picture-in-picture=(), geolocation=(self https://example.com), camera=*;

另外值得注意的是,该响应头无法被编程式修改

<iframe> 标签 allow 属性语法

一般建议在 Permissions-Policy 响应头中指定相对宽泛的 Permissions Policy,并在对应内嵌浏览上下文中通过 <iframe> 标签 allow 属性指定更加严格的 Permissions Policy

基本语法

1
<iframe src="<origin>" allow="<directive> <allowlist>"></iframe>

示例

1
2
3
<iframe src="https://example.com" allow="geolocation 'none'"></iframe>
<iframe src="https://example.com" allow="geolocation 'self' https://a.example.com https://b.example.com"></iframe>
<iframe src="https://example.com" allow="geolocation 'self' https://a.example.com https://b.example.com; fullscreen 'none'"></iframe>

链接

Popover API

Popover API 提供了标准化的显示弹出窗口的形式

Popover API 可以通过 HTML 控制或通过 JavaScript 控制

设置弹出元素

向 HTML 元素指定 popover 属性,以将元素指定为可弹出的,值需要为 automanual 或空字符串之一

auto 代表仅允许显示单个弹出窗口,允许自动关闭弹出窗口

manual 代表允许显示多个弹出窗口,允许手动关闭弹出窗口

1
<div id="popover" popover="auto"></div>

同样可以通过 HTMLElement 接口的 popover 属性指定

1
popoverElement.popover = 'auto';

设置弹出元素的控制元素

控制元素必须为 <button> 元素或 <input type="button" /> 元素

向 HTML 元素指定 popovertarget 属性以设置控制元素控制的弹出元素,值是弹出元素的 id

向 HTML 元素指定 popovertargetaction 属性以设置控制元素的控制行为,值为 hide show toggle 之一

1
<button popovertarget="popover" popovertargetaction="toggle">popover</button>

同样可以通过 HTMLElement 接口的 popoverTargetElement 属性指定控制元素控制的弹出元素,值需要接受一个 HTMLElement

同样可以通过 HTMLElement 接口的 popoverTargetAction 属性指定控制元素的控制行为

1
2
targetElement.popoverTargetElement = popoverElement;
targetElement.popoverTargetAction = 'toggle';

控制弹出元素

调用 HTMLElement 接口的 showPopover() 方法显示弹出窗口

调用 HTMLElement 接口的 hidePopover() 方法隐藏弹出窗口

showPopover() 方法与 hidePopover() 方法在已处于相应状态时会抛出 InvalidStateError 异常

调用 HTMLElement 接口的 togglePopover() 方法切换弹出窗口

togglePopover() 方法允许接受一个 force 参数,以指定期望的行为,但不会抛出异常;并且会返回执行的结果

1
2
3
popoverElement.showPopover();
popoverElement.hidePopover();
popoverElement.togglePopover();

弹出元素事件

beforetoggle 事件在元素的弹出状态改变前触发

toggle 事件在元素的弹出状态改变后触发

两事件均返回一个 ToggleEvent 事件,事件的 newState 属性和 oldState 属性返回 closedopen 之一

弹出元素 CSS 相关

可以利用 :popover-open 伪类选择器选中处于 popover 显示状态的元素

可以利用 ::backdrop 伪元素选择器选中 top-layer 背后的内容并进行特殊的定制

示例

popover window

链接

Device Memory API

Device Memory API 允许获取运行内存容量的大小

JS 使用

通过 Navigator 接口或 WorkerNavigator 接口的 deviceMemory 只读属性使用

返回的值是一个 number 值,0.25 0.5 1 2 4 8

HTTP 使用

服务器在 Accept-CH 响应头中指定 Device-Memory 值,或通过 HTML <meta> 标签的 http-equiv 属性指定

1
Accept-CH: Device-Memory

之后用户代理会通过 Device-Memory 请求头携带对应的信息,具体值同 deviceMemory 属性,如:

1
Device-Memory: 1

类型

1
2
3
4
5
6
7
interface NavigatorDeviceMemory {
readonly deviceMemory: number
}

interface Navigator extends NavigatorDeviceMemory {}

interface WorkerNavigator extends NavigatorDeviceMemory {}

链接

History API

History API 提供了管理浏览会话历史记录的方式

通过 window.history 暴露的 History 接口实例使用

浏览会话历史记录前进后退

History 接口的 back() 方法使浏览会话历史记录后退一条

History 接口的 forward() 方法使浏览会话历史记录前进一条

1
2
history.back()
history.forward()

浏览会话历史记录指定跳转

History 接口的 go() 方法使浏览会话历史记录前进或后退指定数量的记录

传递正数则前进,传递负数则后退

特别的,传递 1 等价于调用 history.forward(),传递 -1 等价于调用 history.back(),传递 0 或不传递参数等价于调用 location.reload()

1
2
3
4
history.go(-1)
history.go(1)
history.go(0)
history.go()

浏览会话历史记录信息

History 接口的 length 只读属性指定当前浏览会话历史记录的数量

1
history.length

History 接口的 scrollRestoration 属性读取或设置浏览会话历史记录默认的导航恢复滚动行为

auto 代表会存储滚动位置,恢复后会自动滚动到存储的位置

manual 代表不会存储滚动位置,恢复后不会自动滚动到存储的位置

1
history.scrollRestoration

浏览会话历史记录数据

History 接口的 state 只读属性反映当前浏览会话历史记录对应的数据,初始为 null 直至调用 pushState() 方法或 replaceState() 方法修改

History 接口的 pushState() 方法向浏览会话历史记录中添加一条历史记录,并更新数据与 URL

History 接口的 replaceState() 方法在浏览会话历史记录中替换当前历史记录,并更新数据与 URL

两方法接收一个 state 参数,可以为任意可序列化的对象或 null,代表与对应的浏览会话历史记录相关的数据

两方法接收一个 unused 参数,因历史原因保留但不再使用,建议传递一个空字符串

两方法接收一个可选的 url 参数,代表与对应的浏览会话历史记录的 URL,受同源策略限制

监听浏览会话历史记录变化

Window 接口的 popstate 事件在浏览会话历史记录变化时触发,返回一个 PopStateEvent 事件

可通过 PopStateEvent 事件的 state 参数读取对应浏览会话历史记录的数据

类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
interface History {
readonly length: number
scrollRestoration: ScrollRestoration
readonly state: any
back(): void
forward(): void
go(delta?: number): void
pushState(data: any, unused: string, url?: string | URL | null): void
replaceState(data: any, unused: string, url?: string | URL | null): void
}

declare var History: {
prototype: History
}

type ScrollRestoration = "auto" | "manual"

链接

Location API

Location API 提供获取和管理当前网页的 URL 的方法

通过 document.locationwindow.location 暴露的 Location 接口实例使用

Location 属性

Location 接口的 ancestorOrigins 只读属性返回一个 DOMStringList,倒序返回所有祖先浏览上下文的源

Location 接口的 hash 属性返回一个 string,代表当前文档 URL 的片段标识符,包含 # 符号

Location 接口的 host 属性返回一个 string,代表当前文档 URL 的主机(包含主机名及端口)

Location 接口的 hostname 属性返回一个 string,代表当前文档 URL 的主机名

Location 接口的 href 属性返回一个 string,代表当前文档 URL 本身

Location 接口的 origin 只读属性返回一个 string,代表当前文档 URL 的源

Location 接口的 pathname 属性返回一个 string,代表当前文档 URL 的路径

Location 接口的 port 属性返回一个 string,代表当前文档 URL 的端口

Location 接口的 protocol 属性返回一个 string,代表当前文档 URL 的协议,包含 : 符号

Location 接口的 search 属性返回一个 string,代表当前文档 URL 的搜索参数,包含 ? 符号

1
2
3
4
5
6
7
8
9
10
11
12
/**
* assume current document's URL is https://example.org:8080/foo/bar?q=baz#bang
*/
location.hash // #bang
location.host // example.org:8080
location.hostname // example.org
location.href // https://example.org:8080/foo/bar?q=baz#bang
location.origin // https://example.org:8080
location.pathname // /foo/bar
location.port // ?q=baz
location.protocol // 8080
location.search // https:

Location 方法

Location 接口的 assign() 方法使用给定 URL 加载新文档(不会替换当前文档对应的历史记录)

方法可能抛出 SecurityError 异常,若调用该方法的域与原域不同源时发生

方法可能抛出 SyntaxError 异常,若尝试解析 URL 参数失败

Location 接口的 reload() 方法用于重新加载当前文档

方法可能抛出 SecurityError 异常,若调用该方法的域与原域不同源时发生

Location 接口的 replace() 方法用于使用给定 URL 重新加载当前文档(会替换当前文档对应的历史记录)

方法可能抛出 SyntaxError 异常,若尝试解析 URL 参数失败

Location 接口的 toString() 方法用于获取当前文档 URL 本身,效果同 href 属性

示例

Hash Host Hostname Href Origin Pathname Port Protocol Search

类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
interface Location {
readonly ancestorOrigins: DOMStringList
hash: string
host: string
hostname: string
href: string;
toString(): string
readonly origin: string
pathname: string
port: string
protocol: string
search: string
assign(url: string | URL): void
reload(): void
replace(url: string | URL): void
}

declare var Location: {
prototype: Location
}

interface Document {
get location(): Location
set location(href: string | Location)
}

interface Window {
get location(): Location
set location(href: string | Location)
}

链接


:D 一言句子获取中...