js的defer属性、async属性和onload

首先看一下defer和async属性与html解析的时间关系
在这里插入图片描述
在这里,可以看到,

  1. 浏览器解析HTML时,如果遇到不带任何属性的script脚本,HTML解析会被阻塞,直到script执行完成,才继续解析
  2. 浏览器解析HTML时,如果遇到带defer属性的script脚本,HTML解析与script加载并行发生,但script的执行要等到所有的HTML解析完成后才会发生
  3. 浏览器解析HTML时,如果遇到带async属性的script脚本,HTML解析与script加载并行发生,但在script执行时,HTML解析被阻塞,script执行结束后,继续HTML解析

一、延迟执行脚本

defer属性

设置这个属性相当于告诉浏览器:可以立即下载JS代码,但不要立即执行!
即使把< script >标签放在< head >标签中,其中的脚本也将延迟到浏览器遇到< /html >标签后再执行。
注:defer属性只适用于外部脚本。
使用方法:

<!doctype html>
<html>
<script type="text/javascript defer src="test1.js"></script>
</head>
<body>
<!-- balbalbalbal~ -->
</body>
</html>

但其实,这个并不建议被使用。最好的选择还是将延迟脚本放在页面底部。

二、异步响应脚本

async属性

与defer类似,只适用于外部脚本文件,并告诉浏览器立即下载文件。
与defer不同的是,标记为async的脚本并不保证按照指定它们的先后顺序执行。(也就是说,谁在上面谁在下面都没有关系~ 所以,你必须要确保两个文件是独立的,它们没有逻辑顺序的关联。)
使用目的:不让页面等待所有的脚本文件下载完后再执行,从而异步加载页面的其他内容。(也就是告诉用户我们的进程正在进行中,不要万念俱灰地离开~)

三、页面初始化事件函数window.onload

一般来说,用了没有定义的变量,系统会报错,比如:

//第一个代码块
<script>
alert(a);
f();
</script>
//第二个代码块
<script>
var a=1;
function f(){}
alert(1);
</script>

由于程序是从上往下执行的,这个是无法运行的。
但是!Javascript响应操作是通过事件驱动的模式实现的。

事件驱动就是指在持续事务管理过程中,进行决策的一种策略,即跟随当前时间点上出现的事件,调动可用资源,执行相关任务,使不断出现的问题得以解决,防止事务堆积。简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数)——百度百科

由于事件发生的不确定性,Javascript事件响应的顺序也是不确定的。但有的时候,要先读一个文档才能让脚本执行。这时候,我们有两种方法解决这个问题:

  1. 将脚本代码放在网页的底端,运行脚本代码的时候,可以确保要操作的对象已经加载完成。
  2. 通过window.onload来执行脚本代码。

这里就用一下下第二种方案。将上面那个错误代码改成:

//第一个代码块
<script>
window.onload=function(){
alert(a);
f();
}
</script>
//第二个代码块
<script>
var a=1;
function f(){
alert(1);
}
</script>
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当我们在网页中使用`<script>`标签来加载外部的JavaScript文件时,我们可以使用`onload`事件来检测脚本的加载是否完成。然而,有时候`onload`事件可能无法被触发,导致脚本加载失败或其他问题。 可能导致`script.onload`不触发的原因有以下几种: 1. 脚本加载速度过快:如果脚本文件非常小,并且网络连接较快,那么脚本可能会在`onload`事件被绑定到`<script>`标签之前加载完成。为了解决这个问题,可以将`<script>`标签放置在所有其他DOM元素之后,或者将`<script>`标签放置在`<body>`标签的末尾。 2. 脚本加载错误:当浏览器无法正确加载脚本文件时,`onload`事件将无法触发。这可能是由于网络连接问题、脚本文件不存在或文件路径错误等原因导致的。我们可以使用网络调试工具(如浏览器开发者工具)来检查是否存在加载错误。 3. 脚本文件被缓存:如果之前已经加载过相同的脚本文件,并且浏览器将其缓存了起来,那么再次加载脚本文件时,浏览器可能会直接从缓存中读取,而不会触发`onload`事件。为了解决这个问题,可以通过在脚本URL的查询参数中添加一个随机数或者文件版本号来强制浏览器重新加载脚本文件。 4. 异步加载脚本:如果在`<script>`标签中添加了`async`属性,则浏览器将异步加载脚本文件,并在加载完成后立即执行,而不会等待`onload`事件触发。如果需要在脚本加载完成后执行某些操作,可以使用`defer`属性或者动态创建`<script>`元素来解决。 无论何种原因导致`script.onload`不触发,我们都可以通过检查浏览器控制台中的错误信息或者使用网络调试工具进行排查,以确定并解决加载问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值