js 脚本位置和执行

参考 高性能javascript

  当浏览器解析到<script>标签的时候,无论这个js代码是内嵌的还是外链的,都会导致页面的下载和渲染阻塞,当js代码下载并执行完毕后,继续页面的下载和渲染(因为脚本的执行过程可能会存在修改页面内容的情况,所以会阻塞页面的下载和渲染)

  我们可以将<script>放在页面的<head>或者<body>,首先我们先将<script>标签放在<head>中

  

<!DOCTYPE html>
<head>
    <meta charset="UTF-8" />
    <script type="text/javascript" src="a.js"></script>
    <script type="text/javascript" src="b.js"></script>

</head>
<body>
    <p>hello</p>
</body>

当以上面的方式放置并加载js代码时,由于js代码会阻塞页面的渲染和其他的元素的下载(允许js并行下载),会导致延迟,变现为页面的空白并且用户无法与页面进行交互

因此推荐将<script>标签放在页面的<body>标签的底部

<!DOCTYPE html>
<head>
    <meta charset="UTF-8" />
</head>
<body>
    <p>hello</p>

    <script type="text/javascript" src="a.js"></script>
    <script type="text/javascript" src="b.js"></script>
</body>

这样当下载和执行js代码的时候页面的大部分内容已经下载完成并显示给了用户。

由于<script>标签会阻塞页面的渲染(即使将<script>标签放在页面的底部,会阻塞未下载完成的其他非js元素)而且还会因为脚本的执行导致一定的延迟,所以最小化延迟时间会改善页面的总体性能

当处理外链的javascript文件时,http请求会带来相应开销,因此我们可以减少外链脚本文件的数量,例如可以通过雅虎的合并处理器,可以通过一个url加载多个js文件(注意这些文件在服务器是独立存在的如果简单的将两个js文件在服务器中合并,在加载的时候只加载合并的文件,这样不仅导致文件的体积变大造成更大的延迟也缺少复用的可能)


无阻塞脚本

通过减少js文件大小并限制http请求数可以提高一定的页面性能,当时当页面越来越复杂的时候,精简源代码并不是总可行,因此提出了无阻塞脚本即在页面加载完成后才加载js代码也就是在window对象的onload事件触发后在下载脚本

1)延迟脚本 defer

这并不是一个理想的跨浏览器解决方案,当我们为<script>标签设置defer属性时,就指明了该元素所含的脚本不会修改DOM,因此代码能安全的延迟执行,但是不支持defer属性的浏览器的时候,<script>标签会以默认的方式处理(阻塞),带有defer属性的<script>可以放在页面的任何位置,在解析到这个<script>标签时候开始现在但不会执行直到DOM加载完成(onload事件被触发前执行),带有defer属性的<script>标签文件下载时,不会阻塞浏览器的其他进程,可以与页面的其他资源并行下载

2)动态脚本元素

这种方法是用标准的DOM方法创建新的<script>元素

     var script = document.createElement("script");
        script.type = "text/javascript";
        script.src = "a.js";
        document.getElementsByTagName("head")[0].appendChild(script);

以这种方式创建并且加载js文件,文件在该元素被添加到页面的时候开始下载,并且在下载和执行的过程中不会阻塞页面的其他进程

但是当这种方式加载js代码,提供的页面其他脚本调用的借口时(提供函数供其他部分使用),就必须确保脚本下载完成并准备就绪

在非IE浏览器中 <script>标签在接收完成时触发一个load事件,可以通过侦听此事件来获得脚本加载完成时的状态

在IE浏览器中 会触发readystatechange事件,主要同时检测两个状态 loaded complete 只要满足其中的一个触发,就删除事件处理器(确保事件不会处理两次)

下面就是相应的方法实现(跨浏览器实现)

<script type="text/javascript">
		function loadScript(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 {//非IE
				script.onload = function() {
					callback();
				}
			}

			script.src = url;
			document.getElementsByTagName(‘head‘)[0].appendChild(script);
		}
	</script>

  

时间: 2024-11-10 13:57:05

js 脚本位置和执行的相关文章

asp.net 后台程序和前台js脚本哪个先执行

服务器加载aspx程序时,首先要执行后台cs文件中的page_load等方法中的代码,其它按钮事件等是不执行的,生成页面发送到客户端 客户端执行时会响应js脚本,提交到服务器后除了执行page_load外,还要执行提交按钮事件等 肯定是后台的啊后台的把程序执行了,返回数据到前台浏览器,浏览器才解释前台脚本

json转换为go类文件,js脚本,nodejs执行

js写的代码生成脚本,json生成对应的go type对象 作json转换用 js脚本无甚何依赖,可以直接运行 执行前,按需更改文件 示例 var topname="Data"; var defaulttype="string"; var bson=true; //对应 mongodb var json=true; //http response var scheme=false; //http request->scheme var jdata={ &quo

关于Jquery,js脚本加载执行先后顺序的一些事

好久没用Jquery了,最近有个东西需要写一下,就想了想那些让脚本延缓执行的一些方法有什么区别呢. (1)当然,第一种方式就是将脚本内嵌在html中相应需要执行的地方,需要等到页面加载完成的话就放在最后.当然这已经是大家很不屑的做法,一般也就是一些测试啊什么的时候会用用或者代码就一几句话,其他很少会这么做了.作为外部文件引入的优点也就不赘述了,一般都明白. (2)将<Script>标签从head放到〈/body〉之前,其他html内容之后.这也很好理解,主要的html加载完之后,脚本才开始运行

异步执行js脚本——防止阻塞

JS允许我们修改页面中的所有方面:内容,样式和用户进行交互时的行为. 但是js同样可以阻塞DOM树的形成并且延迟页面的渲染. 让你的js变成异步执行,并且减少不必要的js文件从而提高性能. JavaScript可以查询和修改DOM和CSSOM JavaScript的执行阻塞了CSSOM的执行 JavaScript 阻塞了DOM的形成,除非特殊声明js异步执行 js是一个同步语言可以修改网页的任何方面: <html> <head> <meta name="viewpo

JS脚本不能执行

这段时间在做前端的动态页面,出了很多问题,因为js平时用的很少,所以花了不少无用功. 其中有两点一定要注意: 1.当js中有语法错误时,js脚本会无法执行. 2.当js脚本中有未定义的变量时,后边的语句不能执行. JS脚本不能执行

80 脚本引擎——js脚本引擎

脚本引擎管理工具 java提供了一个脚本引擎管理工具,从这个工具可以获得各种脚本语言的脚本引擎,如js.python等.我们可以通过脚本引擎,来调用已经写好的脚本文件.相当的方便. 我们可以使用:new ScriptEngineManager()获取一个脚本引擎管理工具对象. 然后,可以通过getEngineByName(scriptName)的方式得到我们想要的脚本引擎. //获取脚本引擎管理器 ScriptEngineManager sem = new ScriptEngineManager

AngularJs中,如何在render完成之后,执行Js脚本

http://www.cnblogs.com/JustRun1983/p/3936371.htm AngularJs是Google开源的前端JS框架.使用AngularJs, 我们能够容易地.健壮的开发出类似于Gmail一样的单页Web应用.AngularJs这个新兴的MVC前端框架,具有以下特点: MVC, 模块化,自动化双向数据绑定,语义化标签.依赖注入等. AngularJs和Jquery的有什么不同? Jquery的主要目的是简化Js编写,专注于浏览器跨平台,主要用来操作DOM.Angu

如何在博客园没有js执行权限下执行js脚本

前言 小弟刚刚申请的这个博客园博客还比较年轻,没有js执行权限,但是我又想执行js脚本,只好动动歪脑筋. 先从博客园管理中的“页首Html代码”中填写script标签代码,发现保存直接被删除了,又测试了下iframe和frame标签,一样被删除了. 被删除,script标签没有被写入DOM: 解决方案-利用IMG标签的行内事件执行JS 虽然script被删,但是在随后的测试中发现可以添加图片标签. 代码: <img src="http://www.baidu.com/img/baidu_j

Ajax中主页加载分页面后,分页面js脚本不执行的解决办法

没看懂,稍后再看 Ajax中主页加载分页面后,分页面js脚本不执行的解决办法 最近捣鼓JQuery,其中强大的Ajax系列函数令人印象深刻,所以做项目时毫不犹豫地采用了一下该技术,在主页中动态加载分页面进来,咋看效果 不错,都能实现了第一层次的加载,但深入下去问题就出来了:动态加载进来的页面中外联了js文件,其中的脚本却没有在加载后运行! (脚本在单独浏览该分页面时运行是正常的) 我郁闷了,打开Firefox中的Firebug查看了加载后的主页面中的DOM,所有元素的加载都是正常的啊~ 自己改来