DOM加载顺序
最近一直在困扰dom的加载顺序问题,经常会遇到以为绑定好的事件不响应等情况,一头雾水,直到请教了周围的同事,才发现了解dom的加载顺序是多么的重要。
关于这个问题,其实网上已经有一些介绍,但是我觉得并不是特别准确,所以还是把自己理解的整理一下~
浏览器解释html文件中的所有内容是从上到下加载的!浏览器解释html文件中的所有内容是从上到下加载的!浏览器解释html文件中的所有内容是从上到下加载的!重要的事情说三遍。
所以我们写文件的时候,要把CSS样式写在head中, 如果放底部的话,页面结构出来了,css还没开始渲染。然而js文件却应该尽量放在下面,除了少量轻量级、并且非常重要的js可以放在上面以外,剩下的都应该写在body底部或body下面,尤其是大一些的js文件,最好也在最后引入。
现在就来说说dom的加载顺序,其实dom的加载真的就是从上到下啊,都打好冒号敲好回车了竟然还是觉得写成一段话比较明白。浏览器解释文件会从上到下顺序解释,遇到样式就把样式加载到内存,遇到标签就加载标签,遇到js就加载js,遇到文件就先下载文件,然后加载里面的内容,加完完内容之后就回到原ng页面接着解释。。。就是酱紫。。。
但是如果就是酱紫哪里还用得着写一篇博客呢?首先,今天我们说的所有都围绕“浏览器解释html文件中的所有内容是从上到下加载的”这句话闸门开的,由于这个特性,会导致很多问题。
那么重点来了,首先在js方法调用上,由于都是解释型语言,所以和python一样,如果我们调用一个js中的方法,而这个js我们是在调用方法之后才引入,就会出现问题。例如:
<script src="/static/js/tree.js"></script>
<script src="/static/js/jquery-1.11.1.min.js"></script>
如上,如果我们在tree.js里面用到了jquery-1.11.1.min.js中的内容,加载的时候就会出问题。。。简单来说就是它还木有解释道后面的js,也就不知道你写的是什么啦~~~
还有一点,我们在初学js的时候,很喜欢给标签绑定function,就像下面这样!
<script type="text/javascript">
$(".nav").on("click","li",function(){
alert(1)
});
</script>
<ul class='nav'>
<li>example blablabla<li>
</ul>
如上例,如果你写成上面那个样子,你就完了!!!因为解释到“$(".nav").on("click","li",function(){”的时候还没有这个nav class呢!这个时候怎么办呢?
<ul class='nav'>
<li>example blablabla<li>
</ul>
<script type="text/javascript">
$(".nav").on("click","li",function(){
alert(1)
});
</script>
<body>
<script type="text/javascript">
$("body").on("click",".nav li",function(){
alert(1)
});
</script>
<ul class='nav'>
<li>example blablabla<li>
</ul>
</body>
2
<script type="text/javascript">
$(function(){
$(".nav").on("click","li",function(){
alert(1)
});
});
</script>
<ul class='nav'>
<li>example blablabla<li>
</ul>
3
上面有三种解决方法,第一种就是把nav放上面去,先加载nav class,再绑定事件;第二种方法是把方法绑到已经加载的body上去,因为body是早就存在的标签了,这里比较有意思的是on方法,它的参数分别是event,target和function,这个target是click事件被触发的时候才去找的,所以也就不会受顺序问题影响了;最后一种方法,$(function(){}),这个是非常好用哒,意思是等到整个页面加载完成之后,再执行里面的方法,也就是说,我们有了这个方法,不管这个nav写在哪里,只要等到加载完在去绑定方法,就ok啦~~~
就是酱,上面的三种方法,第2种和第3种都比较常用,第三种方法比较好理解了,第二种方法往往在实际的操作中容易出错,但是用好了可以发挥更大的作用,自己体会下吧。
有了上面这些基础,就算遇到异步加载等复杂的问题,其实也是由最基本的原因引起的,遇到问题不要慌,一点点的寻找原因,计算机很单纯,你说1它不会做2,总之它不对,一定不是它的错~~~
DOM加载顺序的更多相关文章
- 关于js css html加载顺序整理
1.js放在head中会立即执行,阻塞后续的资源下载与执行.因为js有可能会修改dom,如果不阻塞后续的资源下载,dom的操作顺序不可控. 正常的网页加载流程是这样的. 浏览器一边下载HTML网页,一 ...
- html,css,js加载顺序
1.js放在head中会立即执行,阻塞后续的资源下载与执行.因为js有可能会修改dom,如果不阻塞后续的资源下载,dom的操作顺序不可控. 正常的网页加载流程是这样的. 浏览器一边下载HTML网页,一 ...
- DOM加载:浏览器渲染和操作顺序(转载 学习中。。。)
DOM加载:浏览器渲染和操作顺序 1.HTML解析完毕 2.外部脚本和样式表加载完毕 3.脚本在文档内解析并执行 4.HTML DOM完全构造起来 5.图片和外部内容加载 6.网页完成加载 基于这个顺 ...
- JS 和 CSS 的位置对其他资源加载顺序的影响
JS 和 CSS 在页面中的位置,会影响其他资源(指 img 等非 js 和 css 资源)的加载顺序,究其原因,有三个值得注意的点: JS 有可能会修改 DOM. 典型的,可能会有 document ...
- Ckeditor 的加载顺序
我们的只用在文件里面引用一个CKEditor的js文件--CKEditor目录下的ckeditor.js文件, 该文件会完成后续的所有的CKEidtor依赖的js文件的加载. 所依赖的js文件加载顺序 ...
- jquery的 $(function(){ }) = $(document).ready(function(){ }) ,及页面的加载顺序
document.ready和onload的区别:一.JavaScript文档加载完成事件页面加载完成有两种事件一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件) 二.是onloa ...
- easyui控件的加载顺序
使用easyui做布局时,会模仿窗口程序界面,做出一些较复杂的布局.按由外层到内层的顺序: (最外层)panel->tabs->tabs1 ->tabs2->layout-&g ...
- HTML加载顺序总结测试
首先,页面加载顺序:解析HTML结构.加载外部脚本和样式表文件.解析并执行脚本代码.构造HTML DOM模型.加载图片等外部文件.页面加载完毕. 也就是:html → head → title → # ...
- jquery源码 DOM加载
jQuery版本:2.0.3 DOM加载有关的扩展 isReady:DOM是否加载完(内部使用) readyWait:等待多少文件的计数器(内部使用) holdReady():推迟DOM触发 read ...
随机推荐
- AutoHotkey 使用笔记
注意事项 为了支持中文需安装 AutoHotkey_L Notepad2对ahk代码高亮和折叠支持良好,SciTE则能够提供输入提示 绿色版*.ahk关联AutoHotkey.exe就能双击运行 Au ...
- [JS]jQuery,javascript获得网页的高度和宽度
[JS]jQuery,javascript获得网页的高度和宽度网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeigh ...
- 爱挑剔的acm程序员 acmer
2015-9-2 acmer敢于承认自己的错误,并积极改进.自信.有些酷爱运动,各个方面都很优秀:有些则认为出去“玩”就不是玩,有自己的小世界,玩电脑才是最爱. 2015-9-1 acmer都很聪明, ...
- STM32下FatFs的移植,实现了坏块管理,硬件ECC,ECC纠错,并进行擦写均衡分析
最近因项目需要,做一个数据采集的单片机平台.需要移植 FatFs .现在把最后成果贴上来. 1.摘要 在 STM32 单片机上,成功移植 FatFs 0.12b,使用的 Nand Flash 芯片为 ...
- Ubuntu14 sudo apt-get install apt-show-versions出错
vmware安装ubuntu后,sudo apt-get install apt-show-versions出现问题 E: Unable to locate package apt-show-vers ...
- JSON对象转换问题
今天调用别人接口遇到一个问题,原本约定的data格式为:JSON字符串,但本次返回了一个空字符串"", 大概是这样的 字符串类型的httpResult.data值为字result: ...
- [转]ping检测网络连接异常
转载地址:http://blog.csdn.net/feizxiang3/article/details/26672781 一般来说当出现网络无法连接时,习惯性的用ping命令来ping某个ip地址, ...
- PHP是弱类型语言,自动转换,强制转换
强制转换: (int) - 转换成整型 (bool) - 转换.成布尔型 (float) - 转换成浮点型 (string) - 转换成字符串 (array) - 转换成数组 (object) - 转 ...
- Selenium碰到的异常记录
.markdown-preview:not([data-use-github-style]) { padding: 2em; font-size: 1.2em; color: rgb(171, 178 ...
- JMeter常用测试元件—学习笔记
线程组 Ramp-Up Period:告诉JMeter达到最大线程数需要多长时间.假定共有10个线程,Ramp-Up Period为100秒,那么JMeter就会在100秒内启动所有线程,并让它们运转 ...