国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

jQuery 的 ready()的純js替代方法

2019-11-19 18:55:15
字體:
來源:轉載
供稿:網友

ready 方法是 jQuery 實現的在 html 頁面在 DOM(Document Object Model, 文檔對象模型) 樹完全加載完成后觸發的一個方法. 因為它接收的方法在頁面中所有的 DOM 都可訪問時才執行, 所以此時你完全可以訪問和操作 html 中的元素.

在 jQuery 3.0 之前, 典型的匿名函數方式的用法如下:

$(document).ready(function() { // 在 .ready() 被觸發時執行.});

在 jQuery 3.0 中 ready() 的變化

在 jQuery 3.0 發布之前, 有以下幾種 ready 方法的使用方式:

在 document 對象上: $(document).ready(handler);

在一個空元素上: $().ready(handler);

或直接使用 (即: 不在一個指定的元素上): $(handler);

以上的幾種方式是等價的. 傳入的 handler 會在頁面所有的 DOM 都加載完成后執行, 不管它被哪個指定元素執行. 也就是, 在 image 元素 $("img") 與 document 對象上調用 ready 方法不表明要等待這些元素加載完成后就觸發 handler, 而是在整個 DOM 樹加載完成后才觸發.

在 jQuery 3.0 中, 除了 $(handler); 方法其它的都被棄用了. 官方的理由是:

因為這個選擇與 .ready() 方法的行為沒有關系, 它是低效的并且會誤導用戶猜測這個方法的行為.

Ready 和 Load 事件的不同點

ready 事件在頁面 DOM 完全加載后觸發并能正確的訪問到元素. 而 load 事件在頁面 DOM 及資源文件(圖片,視頻等)都加載完成后才觸發.

load 事件可以像下面這樣使用:

$(window).on("load", function(){ // 當頁面所有資源(圖片,視頻等)全加載完成后才加載執行});

這會等待 DOM 加載完成以及圖片加載完成(根據圖片的大小, 需要加載一定的時間).

對于常規的 DOM 操作你多半不需要 load 事件, 但如果你想做一個等待頁面所有資源加載的一個加載效果或者是計算圖片的大小時這應該是一個不錯的選擇.

你可能并不需要 jQuery.ready()

ready 方法確保了其內部的代碼都能正確的操作 DOM 元素. 這是什么意思? 當你把 JavaScript 代碼放到 HTML 文檔中時它會確保回調函數里面的代碼在瀏覽器在已經加載頁面中所有的元素時執行:

<!doctype html><html> <head>  <meta charset="utf-8">  <title>.ready() 教程</title>  <script src="https://cdn.jsdelivr.net/jquery/latest/jquery.min.js"></script>  <script>   $(function(){ // .ready() 的回調方法, 在 DOM 完全加載完后執行    var length = $("p").length;    // 下面會在console控制臺中輸出 1, 表示有段落 p 存在.    // 這就證明了這個回調方法在 DOM 完全加載完后執行.    console.log(length);   });  </script> </head> <body>  <p>I'm the content of this website</p> </body></html>

如果你把要執行的 JavaScript 放到 body 元素里面的最后位置, 你就不需要用 ready() 方法把代碼包裹在里面了, 因為在 JavaScript 代碼執行時頁面中所有的元素都已經加載完成, 所以此時你就可以訪問或操作元素了:

<!doctype html><html> <head>  <meta charset="utf-8">  <title>.ready() 教程</title> </head> <body>  <p>I'm the content of this website</p>  <script src="https://cdn.jsdelivr.net/jquery/latest/jquery.min.js"></script>  <script>   var length = $("p").length;   // 下面會在console控制臺中輸出 1, 表示有段落 p 存在.   console.log(length);  </script> </body></html>

使用原生 JavaScript 替換 ready()
對于現代瀏覽器, 以及 IE9+, 你可以監聽 DOMContentLoaded 事件:

document.addEventListener("DOMContentLoaded", function(){ // 在 DOM 完全加載完后執行});

在這里要記住當事件已經觸發后回調方法不會執行(頁面觸發事件后才添加的這個事件監聽). 為了確保回調函數始終能執行, jQuery 檢測了document 的 readyState 屬性(參考), 如果檢測出的屬性值是 complete 就立即執行回調函數:

var callback = function(){ // 在 DOM 完全加載完后執行};if (  document.readyState === "complete" ||  (document.readyState !== "loading" && !document.documentElement.doScroll)) { callback();} else { document.addEventListener("DOMContentLoaded", callback);}

你應該始終記得引入 domReady 庫, 它已經實現了這個解決方案.

老版本的 IE

對于 IE8 及以下版本, 你可以使用 onreadystatechange 事件來檢測 document 的 readyState 屬性:

document.attachEvent("onreadystatechange", function(){ // 檢測 DOM 是否加載完全 if(document.readyState === "complete"){  // 為了確保在之后不會再觸發 移除事件監聽  document.detachEvent("onreadystatechange", arguments.callee);  // 實際處理程序... }});

另外你可以使用 load 事件, 像 jQuery 那樣, 這樣就可以在所有的瀏覽器中正確的執行了. 這也導致有一定的時間延遲, 因為它會等所有的資源都加載完成. 記住在這個解決方案中你還是得去檢測 readyState, 如上所述, 這是為了確保當事件已經觸發后也能執行回調函數.

結論

如果你正在尋找一個原生 JavaScript 來代替 ready 方法你可以通過 DOMContentLoaded 事件來解決. 如果你的系統需要支持 IE 那么你就要確保 DOM 已經加載完全!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 板桥市| 常德市| 正安县| 从江县| 呼伦贝尔市| 东宁县| 葵青区| 达州市| 拉萨市| 灌南县| 桓仁| 三河市| 重庆市| 穆棱市| 青冈县| 嘉鱼县| 若尔盖县| 富源县| 南岸区| 侯马市| 西盟| 从江县| 吉林省| 巫溪县| 韶关市| 通城县| 博野县| 武城县| 延川县| 时尚| 莱芜市| 阜南县| 深圳市| 海南省| 呼图壁县| 嘉善县| 宜宾县| 湘潭市| 三穗县| 三穗县| 隆回县|