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 ...
随机推荐
- 简而意赅 HTTP HTTPS SSL TLS 之间有什么不同
HTTP HTTPS SSL TLS 之间有什么不同? SSL是Secure Sockets Layer的缩写.SSL的作用是为网络上的两台机器或设备提供了一个安全的通道. TLS是SSL的一个新的名 ...
- HDU1885 Key Task
The Czech Technical University is rather old — you already know that it celebrates 300 years of its ...
- windows上安装和使用ab压测工具
ApacheBench是一款压力测试工具,用于测试http服务器请求的性能情况. 官方下载链接:https://www.apachehaus.com/cgi-bin/download.plx 百度云: ...
- zabbix系列-Grafana4.6.3+Zabbix 的安装部署
zabbix系列(五) Grafana4.6.3+Zabbix 的安装部署 伟创享 2019-07-31 11:27:18 使用了一段时间Grafana,感觉还挺好用的.部分效果图如下: zabb ...
- 一元建站-基于函数计算 + wordpress 构建 serverless 网站
前言 本文旨在通过 快速部署一个 wordpress 网站到阿里云函数计算平台 这个示例来展示 serverless web 新的开发模式, 包括 FUN 工具一键初始化 NAS, 同步网站到 NAS ...
- Nginx(一)--nginx的初步认识及配置
什么是Nginx 是一个高性能的反向代理服务器正向代理代理的是客户端反向代理代理的是服务端 Apache.Tomcat.Nginx 静态web服务器jsp/servlet服务器 tomcat 安装Ng ...
- HA-高可用集群
原理:两台web服务器,通过心跳线进行通信,当主节点出现服务异常,备用节点通过探测判断主节点是否存活,若是不存活,就把服务接管过来. Web1和Web2中间有一根心跳线,检查对方的存活状态.流动IP: ...
- shell 100
1.编写hello world脚本 #!/bin/bash# 编写hello world脚本 echo "Hello World!"2.通过位置变量创建 Linux 系统账户及密码 ...
- webpack学习1.1 webpack背景介绍
一.为什么要前端需要构建? 开发复杂化 框架去中心化(代码中需要的模块都可以通过npm安装佢解决一个问题,包越来越零散,根据需要来安装) 开发编译化 语言模块化 二.为什么要用webpack? 1.三 ...
- 简单学习【1】——打包JS
webpack entry <entry> output webpack --config webpack.conf.js Step1:新建一个文件,里面有一个app.js 一个sum.j ...