动态脚本元素
这是最通用的解决方案,通过DOM 动态地创建<script>元素并插入到文档中,文件在该元素被添加到页面时开始下载,这样 无论在何时启动下载,文件的下载和执行过程不会阻塞页面其他进程。
不过要注意使用这种方式加载的代码会立刻执行,这样需清楚的了解各文件的作用以及合理的执行顺序,此时跟踪并确保脚本下载完成并准备就绪是很有必要的,非IE浏览器会在<script>元素接收完成时触发一个load 事件,而IE 下则会触发一个readystatechange 事件并通过readyState 属性加以判断便可。以下是兼容地动态加载一个JS 脚本的函数:
function load_script(url, callback) {
var script = document.createElement('script');
script.type ='text/javascript';
if (script.readyState) { //IE
script.onreadystatechange =function() {
if (script.readyState =='loaded'|| script.readyState =='complete') {
script.onreadystatechange =null;
callback();
}
}
} else { //others
script.onload =function() {
callback();
}
}
script.src = url;
document.getElementsByTagName('head')[0].appendChild(script);
}你可以将这个函数保存至一个load_script.js 文件,然后用该函数来加载其他的脚本,当要加载多个脚本时,为了确保正确的加载顺序,可以将load_script() 的执行串联起来,最后如前面说到的放至页面的底部,这便是比较完美的解决方案了:
<script type="text/javascript" src="load_script.js"></script>
<script type="text/javascript">
load_script('file1.js', function() {
load_script('file2.js', function() {
load_script('file3.js', function() {
//全部载入后的操作...
} );
} );
} );
</script>
这里提供了一个动态加载脚本的方法,但有个疑问就是如果JS中有改变页面dom元素的代码,但页面还没加载完怎么办?会有这样的问题吗?
那就写在加载完的后面。
哦,也就是说用这个方法动态加载JS时要写在</body>前是吧
@路人甲说: 不是的,你不是想先要加载完DOM吗,那就在HTML标签的后面写啊,这样肯定是DOM加载完了,在执行js代码的。