JavaScript:DOM加载事件、执行序列和$(document).ready()
我刚刚意识到,我对网页加载到浏览器时到底发生了什么缺乏基本知识 假设我有这样一个结构:JavaScript:DOM加载事件、执行序列和$(document).ready(),javascript,jquery,events,dom,Javascript,Jquery,Events,Dom,我刚刚意识到,我对网页加载到浏览器时到底发生了什么缺乏基本知识 假设我有这样一个结构: <head> <script src="jquery.js" type="text/javascript"></script> <script src="first.js" type="text/javascript"></script> </head> <body> ... <script type="text/ja
<head>
<script src="jquery.js" type="text/javascript"></script>
<script src="first.js" type="text/javascript"></script>
</head>
<body>
...
<script type="text/javascript" id="middle">
// some more JS here...
</script>
...
<script src="last.js" type="text/javascript"></script>
</body>
...
//这里有更多的JS。。。
...
以下是我的问题:
DOMContentLoaded
事件和load
事件。触发DOMContentLoaded
事件时是否触发$(document).ready()
?找不到这方面的任何具体信息(每个人都只提到“加载DOM时”)$(document).ready()
调用last.js
中的代码,但在加载last.js之前运行?它最可能在哪里(在first.js
或内联代码块中)如何防止这种情况发生?因此@4:您不需要阻止该场景,因为first.js总是在last.js执行之前被读取/执行。正如所见,Javascript被执行。通常,浏览器一看到
标记就停止解析页面,下载并运行脚本,然后继续。这就是为什么通常建议将
标记放在底部的原因:这样,当浏览器等待脚本下载时,用户就不会有空白页面
但是,从Firefox3.5开始,脚本在后台下载,而页面的其余部分则呈现出来。在脚本使用document.write
或类似的异常事件中,Firefox将根据需要进行备份和重画。我认为其他浏览器目前不会这样做,但如果它即将推出,我也不会感到惊讶,IE至少在
标记中支持一个defer
属性,该属性将延迟加载脚本,直到加载页面之后
DOMContentLoaded
就是这样:它在加载DOM时立即激发。也就是说,只要浏览器解析了所有HTML并在内部创建了一棵树。它不会等待图像、CSS等加载。DOM是您通常需要运行的所有Javascript,因此不必等待其他资源。然而,我相信只有Firefox支持DOMContentLoaded
;在其他浏览器中,ready()
Javascript保证按照它在HTML中出现的顺序运行,因此在尝试将其附加到事件之前,请确保定义了函数。非常有趣。感谢您的前瞻性观点!事实上,虽然将脚本放在底部会有所帮助,但它们仍然必须在加载页面之前执行。异步加载它们要好得多,这意味着即使您将它们放在顶部,浏览器也会继续解析页面并并行加载脚本。唯一的问题是你不再知道脚本的执行顺序。我在IE9上测试了一个aspx页面(从开发工具模拟),脚本从开始移动到结束,发现当脚本在head中时,加载时间更快。录制加载视频以测量用户体验。对我来说没有明显的赢家