DOMContentLoaded vs jQuery.ready vs onload, How To Decide When Your Code Should Run
At a Glance
- Script tags have access to any element which appears before them in the HTML.
jQuery.ready/DOMContentLoadedoccurs when all of the HTML is ready to interact with, but often before its been rendered to the screen.- The
loadevent occurs when all of the HTML is loaded, and any subresources like images are loaded. - Use
setTimeoutto allow the page to be rendered before your code runs.
Deep Dive
The question of when your JavaScript should run comes down to ‘what do you need to interact with on the page?’.
Scripts have access to all of the elements on the page which are defined in the HTML file before the script tag. This means, if you put your script at the bottom of the <body> you know every element on the page will be ready to access through the DOM:
<html>
<body>
<div id="my-awesome-el"></div> <script>
document.querySelector('#my-awesome-el').innerHTML = new Date
</script>
</body>
</html>
This works just as well for external scripts (specified using the src attribute).
If, however, your script runs before your element is defined, you’re gonna have trouble:
<html>
<body>
<script>
document.querySelector('#my-awesome-el').innerHTML = new Date
/* ERROR! */
</script> <div id="my-awesome-el"></div>
</body>
</html>
There’s no technical difference between including your script in the <head> or <body>, all that matters is what is defined before the script tag in the HTML.
When All The HTML/DOM Is Ready
If you want to be able to access elements which occur later than your script tag, or you don’t know where users might be installing your script, you can wait for the entire HTML page to be parsed. This is done using either the DOMContentLoaded event, or if you use jQuery, jQuery.ready (sometimes referred to as $.ready, or just as $()).
<html>
<body>
<script>
window.addEventListener('DOMContentLoaded', function(){
document.querySelector('#my-awesome-el').innerHTML = new Date
});
</script> <div id="my-awesome-el"></div>
</body>
</html>
the same script using jQuery:
jQuery.ready(function(){
document.querySelector('#my-awesome-el').innerHTML = new Date
});
// OR
$(function(){
document.querySelector('#my-awesome-el').innerHTML = new Date
});
It may seem a little odd that jQuery has so many syntaxes for doing the same thing, but that’s just a function of how common this requirement is.
Run When a Specific Element Has Loaded
DOMContentLoaded/jQuery.ready often occurs after the page has initially rendered. If you want to access an element the exact moment it’s parsed, before it’s rendered, you can use MutationObservers.
var MY_SELECTOR = ".blog-post" // Could be any selector
var observer = new MutationObserver(function(mutations){
for (var i=0; i < mutations.length; i++){
for (var j=0; j < mutations[i].addedNodes.length; j++){
// We're iterating through _all_ the elements as the parser parses them,
// deciding if they're the one we're looking for.
if (mutations[i].addedNodes[j].matches(MY_SELECTOR)){
alert("My Element Is Ready!");
// We found our element, we're done:
observer.disconnect();
};
}
}
});
observer.observe(document.documentElement, {
childList: true,
subtree: true
});
As this code is listening for when elements are rendered, the MutationObserver must be setup before the element you are looking for in the HTML. This commonly means setting it up in the <head> of the page.
For more things you can do with MutationObservers, take a look at our article on the topic.
Run When All Images And Other Resources Have Loaded
It’s less common, but sometimes you want your code to run when not just the HTML has been parsed, but all of the resources like images have been loaded. This is the time the page is fully rendered, meaning if you do add something to the page now, there will be a noticable ‘flash’ of the page before your new element appears.
window.addEventListener('load', function(){
// Everything has loaded!
});
Run When A Specific Image Has Loaded
If you are waiting on a specific resource, you can bind to the load event of just that element. This code requires access to the element itself, meaning it should appear after the element in the HTML source code, or happen inside a DOMContentLoaded or jQuery.ready handler function.
document.querySelector('img.my-image').addEventListener('load', function(){
// The image is ready!
});
Note that if the image fails to load for some reason, the load event will never fire. You can, however, bind to the error event in the same manner, allowing you to handle that case as well.
Run When My Current Changes Have Actually Rendered
Changes you make in your JavaScript code often don't actually render to the page immediately. In the interest of speed, the browser often waits until the next event loop cycle to render changes. Alternatively, it will wait until you request a property which will likely change after any pending renders happen.. If you need that rendering to occur, you can either wait for the next event loop tick;
setTimeout(function(){
// Everything will have rendered here
});
Or request a property which is known to trigger a render of anything pending:
el.offsetHeight // Trigger render // el will have rendered here
The setTimeout trick in particular is also great if you’re waiting on other JavaScript code. When your setTimeout function is triggered, you know any other pending JavaScript on the page will have executed.
DOMContentLoaded vs jQuery.ready vs onload, How To Decide When Your Code Should Run的更多相关文章
- DOMContentLoaded和jquery的ready和window.onload的顺序
document.addEventListener('DOMContentLoaded', function(){ alert(1) }); window.onload=function(){ ale ...
- window.onload、DOMContentLoaded和$(document).ready()
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...
- jQuery Ready 与 Window onload 的区别(转)
“我们都知道,很多时候,在页面加载完后都需要做一些相应的初始化动作.例如,运行某些js特效,设置表单等等.怎么知道页面加载完了呢?一 般情况下都是设置body标签的onload监听window的loa ...
- jQuery的document ready与 onload事件——你真的思考过吗?
在进行实验和资料查询时,我遇到了几个关键问题: 1. window.onload到底是什么加载完触发? 2. body为什么会有onload事件? 3. 为什么是window.onload,而不是do ...
- 学习JQuery的$.Ready()与OnLoad事件比较
$(document).Ready()方法 VS OnLoad事件 VS $(window).load()方法接触JQuery一般最先学到的是何时启动事件.在曾经很长一段时间里,在页面载入后引发的事件 ...
- jquery的$(document).ready()和onload的加载顺序
最近在改一个嵌入在frame中的页面的时候,使用了jquery做效果,而页面本身也绑定了onload事件.改完后,Firefox下测试正常流畅,IE下就要等个十几秒jquery的效果才出现,黄花菜都凉 ...
- jquery ready和window onload区别
window onload是指标签加载完成,并且标签资源加载完成: jquery ready是指标签加载完成,标签资源可能未加载完成 $(document).ready(function(){});= ...
- JavaScript window.onload 事件和 jQuery ready 函数有何不同?
JavaScript window.onload 事件和 jQuery ready 函数之间的主要区别是,前者除了要等待 DOM 被创建还要等到包括大型图片.音频.视频在内的所有外部资源都完全加载.如 ...
- javascript jquery document.ready window.onload
网易 博客 下载LOFTER客户端 注册登录 加关注 凡图的编程之路 2012年7月从一个编程新手的点点滴滴 首页 日志 LOFTER 相册 博友 关于我 日志 关于我 Holy ...
随机推荐
- MySQL必知必会(Select)
SELECT prod_name FROM products; SELECT prod_id, prod_name, prod_price FROM products; SELECT * FROM p ...
- postman tests常用方法
postman常用方法集合: 1.设置环境变量 postman.setEnvironmentVariable("key", "value"); pm.envir ...
- 微信SDK接入报undefined symbol错误
按照官方SDK接入 编译后报如下错误 是因为没有link libc++库导致的.
- Spring Boot缓存Ehcache
Spring Boot 整合 Ehcache 修改 pom 文件 <!-- Spring Boot 缓存支持启动器 --> <dependency> <groupId ...
- ssh远程管理服务的介绍
第6章 远程管理的介绍 6.1 服务的概念介绍 6.1.1 ssh和telnet服务的相同和不同点 ssh: 服务端口号为22 在数据传输的时候是加密的传输 一般在互联网中使用,可以使用root账号进 ...
- imagenet-vgg-verydeep-19.mat格式详解
.mat是matlab生成的文件.用matlab打开文件imagenet-vgg-verydeep-19.mat可以帮助理解其结构.matlab代码如下: a = open('D:\imagenet- ...
- Selenium之xpath绝对路径表示法
xpath写法: 绝对路径:以/开始,逐个增加节点用/分割 特点:不能跨级.类似css中的直接子元素选择器 相对路径:用两个斜杠 // 如 //div//p//a 通配符:xpath也有 ...
- iSensor APP 之 摄像头调试 OV5642 续集2
参考上一篇博客 作为续集,主要测试 RAW格式下的 不同分辨率效果 iSensor APP 之 摄像头调试 OV5642 直接上图吧 720p 拍照效果
- DENEBOLA (See3CAM_CX3RDK) - CX3 Reference Design
Denebola (See3CAM_CX3RDK) is a USB3.0 USB video class (UVC) reference design kit (RDK) developed by ...
- moment.js 默认使用服务器时间
在前端使用Date对象获取当前时间的时候,该时间是客户端的时间.但是该时间可以被用户修改,所以我们一般情况下并不想要这个时间.如果每一次获取时间的时候都请求一下服务器,那么将会对服务器造成不必要的压力 ...