像在jquery中會有
$(function(){})
或者
$.ready(function(){})
來使代碼在DOM加載完成後執行。那麼這裡面的原理是怎麼樣的。先看下面代碼:
ready: function(fn) {
var fired = false;
function trigger() {
if (fired) return;
fired = true;
fn();
}
// check if document already is loaded
if (document.readyState === 'complete'){
setTimeout(trigger);
} else {
this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9
// we can not use jqLite since we are not done loading and jQuery could be loaded later.
// jshint -W064
JQLite(window).on('load', trigger); // fallback to window.onload for others
// jshint +W064
}
},
這個是jQLite的ready方法,可以看出,主要是利用了document的readystate和window的load事件。
document.readyState
主要有三個參數:loading,interactive,complete。
- loading表示document正在加載中;
- interactive表示document加載完成了,但是資源例如圖檔樣式等還沒有加載完;
- completer表示所有都加載完了;
以下是相容性:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcVnVtRGbONjYzZ1ViZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DN5UDNwUTN2EDNyQDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
再說說DOMContentLoaded(不支援IE8)與load事件:
DOM文檔加載的步驟為
- 解析HTML結構。
- 加載外部腳本和樣式表檔案。
- 解析并執行腳本代碼。
- DOM樹建構完成。//DOMContentLoaded
- 加載圖檔等外部檔案。
- 頁面加載完畢。//load
用原生js可以這麼寫
// 不相容老的浏覽器,相容寫法見[jQuery中ready與load事件](http://www.imooc.com/code/),或用jQuery
document.addEventListener("DOMContentLoaded", function() {
// ...代碼...
}, false);
window.addEventListener("load", function() {
// ...代碼...
}, false);
用jQuery這麼寫
// DOMContentLoaded
$(document).ready(function() {
// ...代碼...
});
//load
$(document).load(function() {
// ...代碼...
});