aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/events/domcontentloaded/index.html
blob: 67c6a44253d53fef7d29f8a406db15add2c0bd26 (plain)
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
---
title: DOMContentLoaded
slug: Web/Events/DOMContentLoaded
tags:
  - DOMContentLoaded
  - Window.open()
  - load
  - window.onload
translation_of: Web/API/Window/DOMContentLoaded_event
---
<p>当初始的 <strong>HTML </strong>文档被完全加载和解析完成之后,<strong><code>DOMContentLoaded</code> </strong>事件被触发,而无需等待样式表、图像和子框架的完全加载。</p>

<p>模拟的css文件:CSS.php</p>

<pre class="notranslate">&lt;?php
sleep(3);</pre>

<p>测试代码:</p>

<pre class="notranslate">&lt;link rel="stylesheet" href="css.php"&gt;
&lt;script&gt;
document.addEventListener('DOMContentLoaded',function(){
    console.log('3 seconds passed');
});
&lt;/script&gt;</pre>

<p>如果将link置于script之后,就会立即打印。</p>

<p>{{Note("同步 JavaScript 会暂停 DOM 的解析。")}}</p>

<p>{{Note("还有许多通用和独立的库提供跨浏览器方法来检测 DOM 是否已准备就绪")}}</p>

<h2 id="加速中">加速中</h2>

<p>如果您希望 DOM 在用户请求页面后尽可能快地解析,你可以做的一些事情是把你的 <a href="https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Synchronous_and_Asynchronous_Requests">JavaScript 异步化</a> 以及 <a href="https://developers.google.com/speed/docs/insights/OptimizeCSSDelivery">优化样式表的加载</a>, 由于被并行加载而减慢页面加载,从主 html 文档“窃取”流量。</p>

<h2 id="常规信息">常规信息</h2>

<dl>
 <dt style="float: left; text-align: right; width: 120px;">规范</dt>
 <dd style="margin: 0pt 0pt 0pt 120px;"><a class="external" href="http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end">HTML5</a></dd>
 <dt style="float: left; text-align: right; width: 120px;">接口</dt>
 <dd style="margin: 0pt 0pt 0pt 120px;">Event</dd>
 <dt style="float: left; text-align: right; width: 120px;">是否冒泡</dt>
 <dd style="margin: 0pt 0pt 0pt 120px;"></dd>
 <dt style="float: left; text-align: right; width: 120px;">能否取消</dt>
 <dd style="margin: 0pt 0pt 0pt 120px;">能 (尽管一个简单的事件被指定为不可取消)</dd>
 <dt style="float: left; text-align: right; width: 120px;">目标</dt>
 <dd style="margin: 0pt 0pt 0pt 120px;">Document</dd>
 <dt style="float: left; text-align: right; width: 120px;">默认行为</dt>
 <dd style="margin: 0pt 0pt 0pt 120px;">无.</dd>
</dl>

<h2 id="属性">属性</h2>

<table class="standard-table">
 <thead>
  <tr>
   <th scope="col">属性</th>
   <th scope="col">类型</th>
   <th scope="col">描述</th>
  </tr>
 </thead>
 <tbody>
  <tr>
   <td><code>target</code> {{readonlyInline}}</td>
   <td>{{domxref("EventTarget")}}</td>
   <td>产生该事件的对象(DOM树中最顶级的那个对象).</td>
  </tr>
  <tr>
   <td><code>type</code> {{readonlyInline}}</td>
   <td>{{domxref("DOMString")}}</td>
   <td>事件类型.</td>
  </tr>
  <tr>
   <td><code>bubbles</code> {{readonlyInline}}</td>
   <td>{{jsxref("Boolean")}}</td>
   <td>该事件是否冒泡.</td>
  </tr>
  <tr>
   <td><code>cancelable</code> {{readonlyInline}}</td>
   <td>{{jsxref("Boolean")}}</td>
   <td>该事件是否可取消默认行为.</td>
  </tr>
 </tbody>
</table>

<h2 id="示例" style="margin-bottom: 20px; font-size: 28px; line-height: 28px;">示例</h2>

<pre class="notranslate"><code>&lt;script&gt;
  document.addEventListener("DOMContentLoaded", function(event) {
      console.log("DOM fully loaded and parsed");
  });
&lt;/script&gt;</code></pre>

<pre class="notranslate"><code>&lt;script&gt;
  document.addEventListener("DOMContentLoaded", function(event) {
      console.log("DOM fully loaded and parsed");
  });

  for(var i=0; i&lt;1000000000; i++){
      // </code>这个同步脚本将延迟DOM的解析。
      // 所以DOMContentLoaded事件稍后将启动。
<code>  } </code><code>
&lt;/script&gt;</code></pre>

<h2 id="浏览器兼容性">浏览器兼容性</h2>

<p>{{Compat("api.Window.DOMContentLoaded_event")}}</p>

<p><span>至少从Gecko 1.9.2,Chrome 6,以及Safari 4开始,就已经实现了</span><span>该事件的</span><span>冒泡行为.</span></p>

<h3 id="兼容不支持该事件的浏览器">兼容不支持该事件的浏览器</h3>

<p>在IE8中,可以使用<code>readystatechange</code>事件来检测DOM文档是否加载完毕.在更早的IE版本中,可以通过每隔一段时间执行一次<code>document.documentElement.doScroll("left")来检测这一状态,</code>因为这条代码在DOM加载完毕之前执行时会抛出错误(throw an error)。</p>

<p>诸如jQuery这样的通用JS库,会提供跨浏览器的方法来检测DOM是否加载完成。也有其他专门实现该功能的脚本:<a href="https://github.com/dperini/ContentLoaded/blob/master/src/contentloaded.js" title="https://github.com/dperini/ContentLoaded/blob/master/src/contentloaded.js">contentloaded.js</a> (只能添一个时间监听函数)以及<a href="https://github.com/addyosmani/jquery.parts/blob/master/jquery.documentReady.js" title="https://github.com/addyosmani/jquery.parts/blob/master/jquery.documentReady.js">jquery.documentReady.js</a> (并不依赖jQuery,虽然名字中有jquery).</p>

<h2 id="相关事件">相关事件</h2>

<ul>
 <li>{{event("DOMContentLoaded")}}</li>
 <li>{{event("readystatechange")}}</li>
 <li>{{event("load")}}</li>
 <li>{{event("beforeunload")}}</li>
 <li>{{event("unload")}}</li>
 <li><a href="https://codepen.io/gildata/pen/VrzXOb">DOMContentLoaded demo</a></li>
</ul>