问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ASP问题用js异步为什么加载不了弹出警告框

发布网友 发布时间:2022-05-15 08:58

我来回答

3个回答

懂视网 时间:2022-05-15 13:20

默认的js是同步加载的,这里的“加载”可以理解成是解析、执行,而不是“下载”,在最新版本的浏览器中,浏览器对于代码请求的资源都是瀑布式的加载,而不是阻塞式的,但是js的执行总是阻塞的。这会引起什么问题呢?如果我的index页面要加载一些js,但是其中的某个请求迟迟得不到响应,于是阻塞了后面的js代码的执行(同步加载),同时页面渲染也不能继续(如果js引入是在head标签后)。


比如上面的这段代码,保存为index.html文件,页面的主体是一个简单的字符串,但是代码执行后页面迟迟都是空白,为何?因为请求的js迟迟无法加载(可能由于谷歌被墙等原因),于是阻塞了后面的代码的执行,页面得不到渲染。可能你会提议,把js代码放到</body>前不就能先渲染页面了!好方法,我们尝试着将js放后面:


页面瞬间被渲染,“this is a test"也很快出现在前台,世界似乎平静了,可是:


在前面代码的基础上简单加了一段代码,但是"hello world"迟迟无法在控制台输出,显然前面的js请求阻塞了后面代码的加载,我们恍然大悟,改变js的加载位置只能改变页面的渲染,然而对于js的加载并没有什么卵用,js还是会阻塞。

实现js异步加载

我们的要求似乎很简单,能在页面加载的同时,在控制台输出字符串即可,再讲的通俗一点,就是在请求第一段谷歌提供的js的同时,继续执行下面的js,也就是实现js的异步加载。

最常见的做法是动态生成script标签:


但是还是有点问题,这种加载方式在加载执行完之前会阻止 onload 事件的触发,而现在很多页面的代码都在 onload 时还要执行额外的渲染工作等,所以还是会阻塞部分页面的初始化处理:


比如上面的代码不能很好地渲染”hello world”,我们只需将注释去掉就可以了,让谷歌提供的js在onload 时才开始异步加载。这样就解决了阻塞 onload 事件触发的问题。

补充DOMContentLoaded 与 OnLoad 事件 DOMContentLoaded : 页面(document)已经解析完成,页面中的dom元素已经可用。但是页面中引用的图片、subframe可能还没有加载完。 OnLoad:页面的所有资源都加载完毕(包括图片)。浏览器的载入进度在这时才停止。这两个时间点将页面加载的timeline分成了三个阶段。

以上似乎能较好解决这个问题,但是html5提供了更简便的方法,async属性!


async是html5的新属性,async 属性规定一旦脚本可用,则会异步执行(一旦下载完毕就会立刻执行)。

需要注意的是async 属性仅适用于外部脚本(只有在使用 src 属性时)

defer属性常常和async一起提起:


似乎实现效果差不多,但是真的一样吗?我们来看看defer属性的定义。

以前的defer只支持ie的hack,现在html5的出现开始全面支持defer。defer 属性规定当页面已完成加载后,才会执行脚本。defer 属性仅适用于外部脚本(只有在使用 src 属性时)。ps:ie支持的defer似乎并非如此,因为对ie无感,不深究,有兴趣的可以去查阅相关资料。

既然async和defer经常一起出现,那么辨析一下吧!

如果没有async和defer属性(赋值为true,下同),那么浏览器会立即执行当前的js脚本,阻塞后面的脚本;如果有async属性,加载和渲染后续文档元素的过程将和当前js的加载与执行并行进行(异步);如果有defer属性,那么加载后续文档元素的过程将和 script.js 的加载并行进行(异步),但是 script.js 的执行要在所有元素(DOM)解析完成之后,DOMContentLoaded 事件触发之前完成。

来看一张网上盗的图:

蓝色线代表网络读取,红色线代表执行时间,这俩都是针对脚本的;绿色线代表 HTML 解析。

此图告诉我们以下几个要点(摘自defer和async的区别):

  1. defer 和 async 在网络读取(下载)这块儿是一样的,都是异步的(相较于 HTML 解析)

  2. 它俩的差别在于脚本下载完之后何时执行,显然 defer 是最接近我们对于应用脚本加载和执行的要求的

  3. 关于 defer,此图未尽之处在于它是按照加载顺序执行脚本的,这一点要善加利用

  4. async 则是一个乱序执行的主,反正对它来说脚本的加载和执行是紧紧挨着的,所以不管你声明的顺序如何,只要它加载完了就会立刻执行

  5. 仔细想想,async 对于应用脚本的用处不大,因为它完全不考虑依赖(哪怕是最低级的顺序执行),不过它对于那些可以不依赖任何脚本或不被任何脚本依赖的脚本来说却是非常合适的,最典型的例子:Google Analytics

但是在我看来(以下个人理解,如有出入还望指出),defer在异步加载上的应用并不会比async广。async的英文解释是异步,该属性作用在脚本上,使得脚本加载(下载)完后随即开始执行,和动态插入script标签作用类似(async只支持h5,后者能兼容浏览器);而defer的英文解释是延迟,作用也和字面解释类似,延迟脚本的执行,使得dom元素加载完后才开始有序执行脚本,因为有序,所以会带来另一个问题:


如果执行这段代码,控制台的“hello world”也会迟迟得不到结果。所以我觉得还是async好用,如果要考虑依赖的话,可以选择requirejs、seajs等模块加载器。

总结

JavaScript的异步加载还有一些方式,比如:AJAX eval(使用AJAX得到脚本内容,然后通过eval(xmlhttp.responseText)来运行脚本)、iframe方式等。

相关推荐:

Angular结合zTree异步加载节点数据实例分享

JavaScript文件的同步和异步加载的实现代码

使用DataTable插件实现异步加载数据详解

热心网友 时间:2022-05-15 10:28

xmlhttp组件只是下载页面数据(含javascript代码),但它不会去运行其中的javascript代码的。前台javascript通过xmlhttp获得后台页面数据后再写入某个标签内,也同样不会触发其中的javascript代码的。你用Chrome的“审查元素”功能去看看,你会发现你的<div id="xx"></div>内是有弹出警告框的代码的,只是没有运行而已!

热心网友 时间:2022-05-15 11:46

当然不会有。。。<script>里嵌套一个<script>难道能运行?追问那请问下应该怎么做

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
在淘宝已经难以生存,做瓷砖更是冷清!该何去何从? 谁有新三国志刘备传和刘备传修改器,发到我邮箱里,要无毒!749257071@qq... 昨天早上胸闷呼吸困难心慌头晕,中午睡了一觉好多了,还是有点头晕呼 瓷砖可以在淘宝商城卖吗? 最近几天早上起床觉得晕 眼前物旋转 心慌 到下午就会减轻 血压正常 心率... 做鹌鹑蛋罐头方法 ...电脑用户密码错误,打不开机子,按F8也不起作用,怎么办?请教大侠们 ...我的安装后启动时提示:抱歉,homelanguagework核心模块无效,程序无法... 问什么我的VHDL程序中会出现WORK库找不到呢??恳请大侠指教 谢谢 二年级元旦联欢会作文范文 淘宝网上卖的名牌服装是真品吗?它的进货渠道是哪里? 请问在网上卖的衣服可以买吗? 为什么网上的衣服卖着卖着就绝版了? 可以免费代理微商吗 网上卖的衣服,质量都很差吗 there be 句型的用法 there be的用法?there be 结构是英语中陈述食物客观存在的常用句型,表是有… 谁知道There be 最全面的用法? there be句型的用法有哪些 there be用法 there be 用法 there be 的用法是? 为什么百度发帖总是提示发帖失败 百度发帖失败,什么意思 说是:请不要发表含有不适当内容的留言 请不要发表广告贴 什么意思 为什么高温能使过氧化氢酶丧失活性? 超氧化物歧化酶和过氧化氢酶是怎样的植物防御酶? 人体中过氧化氢酶主要存在于哪里? 过氧化物酶并不是过氧化氢酶,这两个有什么区别 高中生物!过氧化氢酶是胞内酶还是胞外酶? 过氧化氢酶,对生物机体有何意义 80.6%棉 14.6%聚酯纤维 4.1%氨纶 可以算全棉面料吗 (锦纶加氨纶)和(棉+聚脂纤维+氨纶) 哪种材质好? JS异步方法导致的问题 非攻机关术的简介 非攻机关术的介绍 秦时明月,为什么班大师机关术不如公输仇的? 墨家机关 木石走路 青铜开口 要问公输 是什么意思 怎么换用友浏览器 关于在汽车上充电的问题 (就是汽车上不是带充电啊,给手机充电的话,可以冲多长时间啊大概) 五菱之光面包车的电瓶是多大容量的,能充手机充多长时间? 您好,请问我可以买一个汽车电瓶给手机充电吗?一个电瓶满电能充几次 汽车电瓶45ah汽车停车时给手机充电5个小时后电瓶没电了正常吗? CPU 散热器可以装在显卡上吗 呆账的准备与核销 可否将将CPU散热器改装到显卡,高手请教教 哪些字有选择的意思? 要一个字包含选择的意思,我用来取名的! 用cpu风扇给显卡散热,可以吗? CPU风扇可以装在显卡上用吗? 准备将CPU散热器改装到显卡上,大家看看怎么弄好 我想在元好问的词中选字给小女儿取名,请高手指点选哪篇最为合适?小女姓冯