Javascript在页面加载时的执行顺序

JavaScript代码在页面加载时的执行顺序介绍 值得注意的是,外部脚本的加载和执行是异步的,这意味着它们不会阻塞页面的渲染和加载过程。需要注意的是,如果多个外部脚本之间存在依赖关系,确保它们的加载顺序正确。如果一个脚本依赖于另一个脚本中定义的函数或变量,确保先加载被依赖的脚本,再加载依赖的脚本。它们按照在HTML文件中的出现顺序执行,第一个内联脚本先执行,然后是第二个内联脚本。这种方式的代码将在页面加载时立即执行,并且执行顺序与它们在HTML文件中的出现顺序一致。属性将其引入到HTML文件中。属性的脚本的执行顺序不确定,取决于它们的加载完成顺序。 阅读详情
直接在Javascript代码放在标记对<script>和</script>之间  
由<script />标记的src属性制定外部的js文件  
放在事件处理程序中,比如:<p onclick="alert('我是由onclick事件执行的Javascript')">点击我</p>  
作为URL的主体,这个URL使用特殊的Javascript:协议,比如:<a href="javascript:alert('我是由javascript:协议执行的javascript')">点击我</a>  
利用javascript本身的document.write()方法写入新的javascript代码  
利用Ajax异步获取javascript代码,然后执行  
第3种和第4种方法写入的Javascript需要触发才能执行,所以除非特别设置,否则页面加载时不会执行。  
二、Javascript在页面的执行顺序  
  
页面上的Javascript代码是HTML文档的一部分,所以Javascript在页面装载时执行的顺序就是其引入标记<script />的出现顺序, <script />标记里面的或者通过src引入的外部JS,都是按照其语句出现的顺序执行,而且执行过程是文档装载的一部分。  
每个脚本定义的全局变量和函数,都可以被后面执行的脚本所调用。  
变量的调用,必须是前面已经声明,否则获取的变量值是undefined。  
<script type="text/javscrpt">//<![CDATA[  
alert(tmp);  //输出 undefined  
var tmp = 1;  
alert(tmp);  //输出 1  
//]]></script>  
同一段脚本,函数定义可以出现在函数调用的后面,但是如果是分别在两段代码,且函数调用在第一段代码中,则会报函数未定义错误。  
<script type="text/javscrpt">//<![CDATA[  
aa();            //浏览器报错  
//]]></script>  
<script type="text/javscrpt">//<![CDATA[  
aa();           //输出 1   
function aa(){alert(1);}  
//]]></script>  
document.write()会把输出写入到脚本文档所在的位置,浏览器解析完documemt.write()所在文档内容后,继续解析document.write()输出的内容,然后在继续解析HTML文档。  
<script type="text/javascript">//<![CDATA[  
    document.write('<script type="text/javascript" src="test.js"><\/script>');  
    document.write('<script type="text/javascript">');  
    document.write('alert(2);')  
    document.write('alert("我是" + tmpStr);');  
    document.write('<\/script>');  
    //]]></script>  
  <script type="text/javascript">//<![CDATA[  
    alert(3);  
    //]]></script>  
test.js的内容是:  
var tmpStr = 1;  
    alert(tmpStr);  
在Firefox和Opera中的弹出值的顺序是:1、2、我是1、3  
在IE中弹出值的顺序是:2、1、3,同时浏览器报错:tmpStr未定义  
原因可能是IE在document.write时,并未等待加载SRC中的Javascript代码完毕后,才执行下一行,所以导致2先弹出,并且执行到document.write(‘document.write("我是" + tmpStr)’)调用tmpStr时,tmpStr并未定义,从而报错。  
解决这个问题,可以利用HTML解析是解析完一个HTML标签,再执行下一个的原理,把代码拆分来实现:  
<script type="text/javascript">//<![CDATA[  
    document.write('<script type="text/javascript" src="test.js"><\/script>');  
    //]]></script>  
  <script type="text/javascript">//<![CDATA[  
    document.write('<script type="text/javascript">');  
    document.write('alert(2);')  
    document.write('alert("我是" + tmpStr);');  
    document.write('<\/script>');  
    //]]></script>  
  <script type="text/javascript">//<![CDATA[  
    alert(3);  
    //]]></script>  
这样IE下和其他浏览器输出值的顺序都是一直的了:1、2、我是1、3。  
三、如何改变Javascript在页面的执行顺序  
  
利用onload  
<script type="text/javascript">//<![CDATA[  
window.onload = f;  
function f(){alert(1);}  
alert(2);  
//]]></script>  
输出值顺序是 2、1。  
需要注意的是,如果存在多个winodws.onload的话,只有最有一个生效,解决这个办法是:  
window.onload = function(){f();f1();f2();.....}  
利用2级DOM事件类型  
if(document.addEventListener){  
window.addEventListener('load',f,false);  
window.addEventListener('load',f1,false);  
...  
}else{  
window.attachEvent('onload',f);  
window.attachEvent('onload',f1);  
...  
}  
IE中可以利用defer,defer作用是把代码加载下来,并不立即执行,等文档装载完毕之后再执行,有点类似window.onload,但是没有window.onload那样的局限性,可以重复使用,但是只在IE中有效,所以上面的例子可以修改成为  
<script type="text/javascript">//<![CDATA[  
document.write('<script type="text/javascript" src="test.js"><\/script>');  
document.write('<script type="text/javascript" defer="defer">');  
document.write('alert(2);')  
document.write('alert("我是" + tmpStr);');  
document.write('<\/script>');  
//]]></script>  
<script type="text/javascript">//<![CDATA[  
alert(3);  
//]]></script>  
这样IE就不报错了,输出值的顺序变成:1、3、2、我是1  
当HTML解析器遇到一个脚本,它必须按常规终止对文档的解析并等待脚本执行。为了解决这个问题HTML4标准定义了defer。通过defer来提示浏览器可以继续解析HTML文档,并延迟执行脚本。这种延迟在脚本从外部文件载入时非常有用,让浏览器不必等待外部文件全部载入之后才继续执行,能有效的提高性能。IE是目前唯一支持defer属性的浏览器,但IE并没有正确的实现了defer属性,因为延迟的脚本总是被延迟,直到文档结束,而不是只延迟到下一个非延迟的脚本。这意味着,IE中延迟的脚本的执行顺序相当混乱,并且不能定义任何后面非延迟脚本并须的函数和变量。在IE中所有的defer的脚本执行时间应该都是HTML文档树建立以后,window.onload之前。  
利用Ajax。  
因为xmlhttpRequest能判断外部文档加载的状态,所以能够改变代码的加载顺序。  
摘自:http://dancewithnet.com/2007/03/22/order-of-execution-of-javascript-on-web/


模型预测控制(MPC)解析(三):多输入多输出系统 本文为阅读笔记,仅供学习交流使用!!! 在之前的文章中,为了简单起见,以单输入单输出系统为例介绍了MPC控制的实现方法。因为使用的是状态空间方程作为系统模型,这种方法可以轻松的扩展到多输入多输出系统中。 ... 阅读详情

相关推荐

CHI里的Error handling机制

本文讲解了CHI里的Error handling机制。

W1Z1Q的专栏 2500

html js页面加载前执行,Javascript代码在页面加载时的执行顺序介绍

一、在HTML中嵌入Javasript的方法1.直接在Javascript代码放在标记对和之间2.由标记的src属性制定外部的js文件3.放在事件处理程序中,比如:点击我4.作为URL的主体,这个URL使用特殊的Javascript:协议,比如:点击我5.利用javascript本身的document.write()方法写入新的javascript代码6.利用Ajax异步获取javascript代...

weixin_30871695的博客 4259

CSR-DCF视频目标跟踪源码运行笔记

论文基本信息 论文标题:Discriminative Correlation Filter with Channel and Spatial Reliability 论文作者:Alan Lukezic等 论文出处:CVPR 2017 文章链接:https://arxiv.org/abs/1611.08461 补充材料:https://www.semanticscholar.org/paper/D...

越野者的博客 3400

Javascript在网页页面加载时的执行顺序

Javascript在网页页面加载时的执行顺序http://www.webjx.com  更新日期:2007-04-29 11:17  出处:网页教学网  作者:一、在HTML中嵌入Javasript的方法 直接在Javascript代码放在标记对和之间 由标记的src属性制定外部的js文件 放在事件处理程序中,比如:点击我

gauss32的专栏 1610

DDR5内存设计实战:如何通过CA_ODT引脚优化信号完整性(附配置示例)

本文深入探讨DDR5内存设计中CA_ODT引脚的配置与优化策略,通过Group A/Group B分组控制提升信号完整性。详细解析了ODT机制、PCB布局要点及寄存器配置方法,并附实战案例与配置示例,帮助工程师解决高速信号传输中的反射问题,确保DDR5系统稳定运行。

weixin_29202213的博客 399

TP4056锂电池充电电路设计原理与工程实践

锂离子电池充电管理是嵌入式电源系统的核心基础技术,其本质是通过恒流恒压(CC/CV)控制策略,匹配电池电化学特性以实现安全、高效、长寿命充放电。TP4056作为典型线性充电IC,以精简外围实现预充、恒流、恒压及自动截止全周期管理,但受限于线性拓扑的热耗散特性,必须协同散热设计、电阻精度选型与PCB布局进行系统级优化。该方案广泛应用于STM32智能小车、便携传感器节点等3.7V单节锂电供电场景,兼顾成本、可靠性与工程可实施性,是入门嵌入式硬件电源设计的关键实践范例。

weixin_36064575的博客 219

Javascript在网页的页面加载时执行的顺序

一、在HTML中嵌入Javasript的方法1、直接在Javascript代码放在标记对和之间2、由标记的src属性制定外部的js文件3、放在事件处理程序中,比如:点击我4、作为URL的主体,这个URL使用特殊的Javascript:协议,比如:点击我5、利用javascript本身的document.write()方法写入新的javascript代码6、利用Ajax异步获取javascrip

Cedar's Columnists 800

Tesseral 建立地震模型

0. 前言 本节内容主要是总结如何使用 Tesseral 工具建立模型。 1. 模型建立步骤 设置模型的宽度和深度 此处默认都为1000,之后点击“确定” 建立地层 绘制新的地层 右键点击“New polygon” 绘制地层,设置第二个层的名字和纵波速度 绘制第三层,第三层覆盖在前一个层上 第四层如上,第四层如果是最后一层,绘制该层时,要将深度1000包围。 设置观测系统 设置炮点 设置子波为雷克子波,频率设置为30 检波点设置 运行模型 设置好如上选择后,

weixin_41857483的博客 6539

html页面加载事件顺序,Javascript在网页页面加载时的执行顺序

一、在HTML中嵌入Javasript的方法1、直接在Javascript代码放在标记对和之间2、由标记的src属性制定外部的js文件3、放在事件处理程序中,比如:点击我4、作为URL的主体,这个URL使用特殊的Javascript:协议,比如:点击我5、利用javascript本身的document.write()方法写入新的javascript代码6、利用Ajax异步获取javascript代...

weixin_28811757的博客 790

x86架构学习之中断

外部中断,一般是由CPU的外部引脚电信号触发,这些引脚留给硬件厂商去定义中断,例如主板厂商可以将USB中断挂载70号中断引脚上,MCU厂商可以将片上外设(SPI、I2C等)的中断挂载在指定中断线上。中断描述符主要用于说明该中断的入口地址,中断描述符表则是将中断描述符一项一项管理在一个数组中,每一项中断描述符占用8个字节(64位模式下,占用16字节),其。简称中断,后文如果没特别说明,中断都指外部中断,由外部IO事件触发,由于时钟源来自CPU外部,与CPU时钟不同源,因此是异步事件。

qq_26962739的博客 1571

信号检测算法的MATLAB仿真:能量检测、循环平稳检测和匹配滤波检测

根据具体的应用场景和要求,选择合适的信号检测算法可以提高系统的性能和可靠性。在无线电通信中,信号检测是一项重要的任务,它用于检测和识别接收到的信号。在本文中,我们将介绍三种常用的信号检测算法:能量检测、循环平稳检测和匹配滤波检测,并提供相应的MATLAB源代码进行仿真实现。在上述代码中,我们首先设置了能量检测的阈值,然后生成了一个包含1000个服从正态分布的随机信号样本的信号。在上述代码中,我们首先设置了信号模板,然后生成了一个包含信号模板的信号样本。最后,通过比较相关性的最大值与阈值来判断信号是否存在。

PixelLancer的博客 1363

html窗口加载多个事件顺序,Javascript代码在页面加载时的执行顺序介绍

一、在HTML中嵌入Javasript的方法1.直接在Javascript代码放在标记对和之间2.由标记的src属性制定外部的js文件3.放在事件处理程序中,比如:点击我4.作为URL的主体,这个URL使用特殊的Javascript:协议,比如:点击我5.利用javascript本身的document.write()方法写入新的javascript代码6.利用Ajax异步获取javascript代...

weixin_39889481的博客 309

AI翻译工具自动翻译日语视频生成srt中文字幕,支持离线轻松生成任意日语视频字幕!可选择支持显卡模式和cpu模式低显存也能用

【AI离线字幕神器:日语视频一键转中文字幕】推荐一款基于Faster-Whisper的本地化字幕工具,可离线生成日语视频的中文字幕(.srt格式),支持CPU/GPU加速处理。实测1小时视频最快4-5分钟完成翻译,无需联网保护隐私。操作简单只需拖拽文件,支持批量处理音频(mp3/wav)和视频(mp4/mkv)文件,还能自定义输出格式和参数调整。特别适合需要观看无字幕日语资料的用户,堪称技术宅必备神器。下载地址附后,包含详细使用教程和参数配置说明。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1万+
上一篇: jQuery初体验
下一篇: jquery load方法
beyond667
博客等级 码龄15年 41粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值