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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
---
title: DOMHighResTimeStamp
slug: Web/API/DOMHighResTimeStamp
tags:
- DOMHighResTimeStamp
- High Resolution Time
translation_of: Web/API/DOMHighResTimeStamp
---
<p>{{APIRef("High Resolution Time")}}</p>
<p><code><strong>DOMHighResTimeStamp</strong></code> 是一个double类型,用于存储毫秒级的时间值。这种类型可以用来描述离散的时间点或者一段时间(两个离散时间点之间的时间差)。</p>
<p>这种基于毫秒精度的时间,应该精确到5微秒级别,其数值的小数部分代表了一个毫秒的小数(也就是微秒)。但是,如果浏览器不能提供精确到5微秒的时间值(例如,由于硬件或软件的限制),浏览器可以在表示一个以毫秒为单位的时间值时,精确到毫秒级别。同时要注意,在下一节中提到,由浏览器首选项控制的<strong>降低时间精度,</strong>是为了防止时序攻击和记录指纹。</p>
<p>此外,如果用户代理运行所在的设备或操作系统不具备精确到微秒级别的时钟,那么他们只能精确到毫秒。</p>
<h2 id="降低时间精度">降低时间精度</h2>
<p><em></em><br>
为了提供对抗时序攻击和记录指纹的保护措施,时间戳可能会四舍五入,这取决于浏览器设置。在火狐浏览器中,<code>privacy.reduceTimerPrecision</code> 首选项默认被启用,并且在或火狐浏览器59版本中,它的默认值是20微秒。在火狐浏览器60版本中,这个默认值将是2毫秒。</p>
<pre class="notranslate">// reduced time precision (2ms) in Firefox 60
event.timeStamp
// 1519211809934
// 1519211810362
// 1519211811670
// ...
// reduced time precision with `privacy.resistFingerprinting` enabled
event.timeStamp;
// 1519129853500
// 1519129858900
// 1519129864400
// ...</pre>
<p>在火狐浏览器中,你也可以启用 <code>privacy.resistFingerprinting</code> ,这使得时间戳的精度变成100毫秒或 <code>privacy.resistFingerprinting.reduceTimerPrecision.microseconds</code> 的值,以较大者为准。</p>
<h2 id="属性">属性</h2>
<p><em>这个类型没有属性。它是一个双精度浮点数。</em></p>
<h3 id="值">值</h3>
<p><code>DOMHighResTimeStamp</code> 的值是一个双精度浮点数,它描述了两个时间点之间的经过的毫秒数(可以精确到5微秒,如果设备支持)。开始时间可以是由网站或app中的脚本定义的一个特定时间T,也可以是<strong>时间源</strong>。</p>
<h4 id="时间源">时间源</h4>
<p><strong>时间源</strong>是一个可以被认定为当前文档生命周期的开始节点的标准时间,计算方法如下:</p>
<ul>
<li>如果脚本的 {{Glossary("global object")}} 是 {{domxref("Window")}}, 则时间源的确定方式如下:
<ul>
<li>如果当前 {{domxref("Document")}} 是中加载的第一个 <code>Window</code>, 则<strong>时间源</strong>是创建浏览器上下文的时间。</li>
<li>如果处于卸载窗口中已加载的先前文档的过程中,一个确认对话框会显示出来,让用户确认是否离开前一页,则<strong>时间源</strong>是用户确认导航到新页面的这个时间,这一点是被认同的。</li>
<li>如果以上方式都不能确定<strong>时间源</strong>, 那么<strong>时间源</strong>是创建窗口中当前 <code>Document</code> 的导航发生的时机。</li>
</ul>
</li>
<li>如果脚本中的全局对象是 {{domxref("WorkerGlobalScope")}} (意味着, 该脚本以web worker的形式运行), 则<strong>时间源</strong>是这个worker被创建的时刻。 </li>
<li>在所有其他情况下, <strong>时间源</strong>的值是undefined。</li>
</ul>
<h2 id="方法">方法</h2>
<p><em>这个类型没有方法。</em></p>
<h2 id="用法说明">用法说明</h2>
<p>您可以通过调用 {{domxref("performance")}} 的 {{domxref("performance.now", "now()")}} 方法来获取当前的时间戳的值(自创建上下文以来经过的时间)。此方法在 {{domxref("Window")}} 和 {{domxref("Worker")}} 上下文中均可用.</p>
<h2 id="示例">示例</h2>
<p>如果你需要确定从代码中某处开始经过了多少时间,可以执行以下操作:</p>
<pre class="notranslate">let startTime = performance.now();
/* ... do things for a while ... */
let elapsedTime = performance.now() - startTime;
</pre>
<p>执行完毕后, <code>elapsedTime</code> 的值是从你在第一行代码记录的时间点开始后经过的毫秒数。</p>
<h2 id="Specifications" name="Specifications">规范</h2>
<table class="standard-table">
<thead>
<tr>
<th scope="col">Specification</th>
<th scope="col">Status</th>
<th scope="col">Comment</th>
</tr>
</thead>
<tbody>
<tr>
<td>{{SpecName('Highres Time Level 2', '#dom-domhighrestimestamp', 'DOMHighResTimeStamp')}}</td>
<td>{{Spec2('Highres Time Level 2')}}</td>
<td>Stricter definitions of interfaces and types.</td>
</tr>
<tr>
<td>{{SpecName('Highres Time', '#sec-DOMHighResTimeStamp', 'DOMHighResTimeStamp')}}</td>
<td>{{Spec2('Highres Time')}}</td>
<td>Initial definition.</td>
</tr>
</tbody>
</table>
<h2 id="Browser_compatibility" name="Browser_compatibility">浏览器兼容性</h2>
<div>{{CompatibilityTable}}</div>
<div id="compat-desktop">
<table class="compat-table">
<tbody>
<tr>
<th>Feature</th>
<th>Chrome</th>
<th>Firefox (Gecko)</th>
<th>Internet Explorer</th>
<th>Opera</th>
<th>Safari (WebKit)</th>
</tr>
<tr>
<td>Basic support</td>
<td>6</td>
<td>{{CompatGeckoDesktop("7.0")}}</td>
<td>9</td>
<td>15.0</td>
<td>8</td>
</tr>
</tbody>
</table>
</div>
<div id="compat-mobile">
<table class="compat-table">
<tbody>
<tr>
<th>Feature</th>
<th>Android</th>
<th>Firefox Mobile (Gecko)</th>
<th>IE Phone</th>
<th>Opera Mobile</th>
<th>Safari Mobile</th>
</tr>
<tr>
<td>Basic support</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatGeckoMobile("15.0")}}</td>
<td>9</td>
<td>15.0</td>
<td>9</td>
</tr>
</tbody>
</table>
</div>
<h2 id="相关内容">相关内容</h2>
<ul>
<li><a href="/en-US/docs/Navigation_timing" title="/en-US/docs/Navigation_timing">Navigation Timing API</a></li>
<li><a href="/en-US/docs/Web/API/Performance/now">Performance.now()</a></li>
<li><a href="https://www.w3.org/TR/hr-time/#sec-DOMHighResTimeStamp">https://www.w3.org/TR/hr-time/#sec-DOMHighResTimeStamp</a></li>
<li><a href="https://www.w3.org/TR/hr-time-2/">https://www.w3.org/TR/hr-time-2/</a></li>
</ul>
|