We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
script
(function(){ var scriptEle = document.createElement("script"); scriptEle.type = "text/javasctipt"; scriptEle.async = true; scriptEle.src = "http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js"; var x = document.getElementsByTagName("head")[0]; x.insertBefore(scriptEle, x.firstChild); })();
但是这种加载方式执行完之前会阻止onload事件的触发,而现在很多页面的代码都在onload时还执行额外的渲染工作,所以还是会阻塞部分页面的初始化处理。
阻止onload事件的触发
注意: 页面加载完成有两种事件:
(function(){ if(window.attachEvent){ window.attachEvent("load", asyncLoad); }else{ window.addEventListener("load", asyncLoad); } var asyncLoad = function(){ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); } })();
这种方法只是把插入script的方法放在一个函数里面,然后放在window的onload方法里面执行,这样就解决了阻塞onload事件触发的问题。
注: DOMContentLoaded与load的区别。前者是在document已经解析完成,页面中的dom元素可用,但是页面中的图片,视频,音频等资源未加载完,DOMContentLoaded作用同jQuery中的ready事件;后者的区别在于页面所有资源全部加载完毕。
DOMContentLoaded
load
ready
需要引入jquery,兼容所有浏览器
$(document).ready(function() { alert("加载完成!"); });
<script type="text/javascript" src="xxx.js" async="async"></script>
对于async标记,浏览器的解析过程是这样的:
<script type="text/javascript" defer></script>
对于defer标记,浏览器的解析过程是这样的:
浏览器对于带有type=”module”的<script>,都是异步加载,不会造成堵塞浏览器,即等到整个页面渲染完,再执行模块脚本,等同于打开了<script>标签的defer属性 。如下:
type=”module”
<script>
<script type="module" src="XXX.js"></script>
window.onload()(不推荐)
window.onload = function() { console.log("text1");}; window.onload = function() { console.log("text2");}; // ƒ () { console.log("text2");} // 结果只输出第二个
$(document).ready()
$(function () {})
$(document).ready(function(){console.log("Hello")}); $(document).ready(function(){console.log("Hello")}); // Hello // Hello
async和defer这两个属性只是script标签在header标签中使用的,如果你把它放在body后面是无效的
async
defer
header标签
The text was updated successfully, but these errors were encountered:
No branches or pull requests
js动态添加
script
标签但是这种加载方式执行完之前会
阻止onload事件的触发
,而现在很多页面的代码都在onload时还执行额外的渲染工作,所以还是会阻塞部分页面的初始化处理。注意:
页面加载完成有两种事件:
onload时的异步加载
这种方法只是把插入script的方法放在一个函数里面,然后放在window的onload方法里面执行,这样就解决了阻塞onload事件触发的问题。
注:
DOMContentLoaded
与load
的区别。前者是在document已经解析完成,页面中的dom元素可用,但是页面中的图片,视频,音频等资源未加载完,DOMContentLoaded
作用同jQuery中的ready
事件;后者的区别在于页面所有资源全部加载完毕。$(document).ready()
需要引入jquery,兼容所有浏览器
<script>标签的async="async"属性
对于async标记,浏览器的解析过程是这样的:
<script>标签的defer="defer"属性
对于defer标记,浏览器的解析过程是这样的:
es6模块type="module"属性
浏览器对于带有
type=”module”
的<script>
,都是异步加载,不会造成堵塞浏览器,即等到整个页面渲染完,再执行模块脚本,等同于打开了<script>标签的defer属性 。如下:ready()与onload()的区别
举例:
$(function () {})
。举例:
注意
async
和defer
这两个属性只是script标签在header标签
中使用的,如果你把它放在body后面是无效的The text was updated successfully, but these errors were encountered: