`
xiaotian8945
  • 浏览: 3936 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何加载JS

    博客分类:
  • web
阅读更多
外部JS的阻塞下载
所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等。至到JS下载、解析、执行完毕后才开始继续并行下载其他资源并呈现内容。

有人会问:为什么JS不能像CSS、image一样并行下载了?这里需要简单介绍一下浏览器构造页面的原理,
当浏览器从服务器接收到了HTML文档,并把HTML在内存中转换成DOM树,在转换的过程中如果发现某个节点(node)上引用了CSS或者IMAGE,就会再发1个request去请求CSS或image,然后继续执行下面的转换,而不需要等待request的返回,当request返回后,只需要把返回的内容放入到DOM树中对应的位置就OK。但当引用了JS的时候,浏览器发送1个js request就会一直等待该request的返回。因为浏览器需要1个稳定的DOM树结构,而JS中很有可能有代码直接改变了DOM树结构,比如使用document.write 或 appendChild,甚至是直接使用的location.href进行跳转,浏览器为了防止出现JS修改DOM树,需要重新构建DOM树的情况,所以就会阻塞其他的下载和呈现.

阻塞下载图:下图是访问blogjava首页的时间瀑布图,可以看出来开始的2个image都是并行下载的,而后面的2个JS都是阻塞下载的(1个1个下载)。

嵌入JS的阻塞下载
嵌入JS是指直接写在HTML文档中的JS代码。上面说了引用外部的JS会阻塞其后的资源下载和其后的内容呈现,哪嵌入的JS又会是怎样阻塞的了,看下面的列2个代码:
代码1:
复制代码 代码如下:
<ul>
<<li>blogjava></li>
<li>CSDN></li>
<li>博客园></li>
<li>ABC></li>
<li>AAA></li>
<ul>
<div>
<script type="text/javascript">
// 循环5秒钟
var n = Number(new Date());
var n2 = Number(new Date());
while((n2 - n) (6*1000)){
n2 = Number(new Date());
}
</script>
<div>
<ul>
<li>MSN></li>
<li>GOOGLE></li>
<li>YAHOO></li>
</ul>
</div>

代码2(test.zip里面的代码与代码1的JS代码一模一样):
复制代码 代码如下:
<div>
<ul>
<li>blogjava></li>
<li>CSDN></li>
<li>博客园></li>
<li>ABC></li>
<li>AAA></li>
<ul>
<div>
<script type="text/javascript" src="test.zip"><script>
<div>
<ul>
<li>MSN></li>
<li>GOOGLE></li>
<li>YAHOO></li>
</ul>
</div>

运行后,会发现代码1中,在前5秒中页面上是一篇空白,5秒中后页面全部显示。 代码2中,前5秒中blogjava,csdn等先显示出来,5秒后MSN才显示出来。
可以看出嵌入JS会阻塞所有内容的呈现,而外部JS只会阻塞其后内容的显示,2种方式都会阻塞其后资源的下载。

嵌入JS导致CSS阻塞加载的问题

CSS怎么会阻塞加载了?CSS本来是可以并行下载的,在什么情况下会出现阻塞加载了(在测试观察中,IE6下CSS都是阻塞加载,下面的测试在非IE6下进行):
代码1(为了效果,这里选择了1个国外服务器的CSS):
复制代码 代码如下:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>js test>title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link type="text/css" rel="stylesheet" href="http://69.64.92.205/Css/Home3.css" />
</head>
<body>
<img src="http://www.jb51.net/images/logo.gif" /><</span>br />
<img src="http://csdnimg.cn/www/images/csdnindex_piclogo.gif" />
</body>
</html>

时间瀑布图:

代码2(只加了1个空的嵌入JS):
<head>
<title>js test>title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link type="text/css" rel="stylesheet" href="http://69.64.92.205/Css/Home3.css" />
<script type="text/javascript">
function a(){}
</script>
<head>
<body>
<img src="http://www.jb51.net/images/logo.gif" /><</span>br />
<img src="http://csdnimg.cn/www/images/csdnindex_piclogo.gif" />
</body>
时间瀑布图:

从时间瀑布图中可以看出,代码2中,CSS和图片并没有并行下载,而是等待CSS下载完毕后才去并行下载后面的2个图片,当CSS后面跟着嵌入的JS的时候,该CSS就会出现阻塞后面资源下载的情况。
有人可能会问,这里为什么不说说嵌入的JS阻塞了后面的资源,而是说CSS阻塞了? 想想我们现在用的是1个空函数,解析这个空函数1ms就够,而后面2个图片是等CSS下载完1.3s后才开始下载。大家还可以试试把嵌入JS放到CSS前面,就不会出现阻塞的情况了。
根本原因:因为浏览器会维持html中css和js的顺序,样式表必须在嵌入的JS执行前先加载、解析完。而嵌入的JS会阻塞后面的资源加载,所以就会出现上面CSS阻塞下载的情况。
嵌入JS应该放在什么位置

1、放在底部,虽然放在底部照样会阻塞所有呈现,但不会阻塞资源下载。
2、如果嵌入JS放在head中,请把嵌入JS放在CSS头部。
3、使用defer
4、不要在嵌入的JS中调用运行时间较长的函数,如果一定要用,可以用setTimeout来调用

PS:很多网站喜欢在head中嵌入JS,并且习惯放在CSS后面,比如看到的www.qq.com,当然也有很多网站是把JS放到CSS前面的,比如yahoo,google

[声明] 转载请注明出处:http://www.blogjava.net/BearRui/。 禁止商用!
分享到:
评论

相关推荐

    javascript函数动态加载javascript文件

    加载JS文件时,可以创建一个新的XMLHttpRequest实例,打开到目标URL的连接,然后发送请求。当服务器响应时,将返回的JS代码插入到`&lt;script&gt;`标签中。例如: ```javascript var xhr = new XMLHttpRequest(); xhr....

    vue动态加载js.zip

    Vue动态加载JS是一种实现这一需求的技术,它允许我们在运行时根据需要加载JavaScript文件。本文将深入探讨Vue动态加载JavaScript的原理、方法以及其实现步骤。 首先,我们需要理解Vue动态加载的核心概念。在HTML中...

    网页按顺序加载 最后加载js广告

    在这个过程中,浏览器会按照HTML、CSS、JavaScript的顺序逐行解析资源,最后加载JS广告。这样的加载策略有助于优化用户体验,因为主要内容可以更快地呈现给用户,而广告通常被视为非关键元素。 首先,我们来看网页...

    懒加载js控件 dropload.min.js

    标题提到的"懒加载js控件 dropload.min.js"就是一个专门用于实现这种效果的JavaScript库,适用于移动端开发。dropload.min.js是一个经过压缩和优化的小型库,旨在提供高效的懒加载功能。"min.js"表示这是一个最小化...

    jsloader 异步加载js文件

    `JSLoader`就是这样一种工具,它允许开发者在JSP页面中异步地加载JS文件,提高页面性能。 ### 异步加载的优势 1. **提升性能**:异步加载可以确保页面主体内容先加载,用户可以更快地看到页面内容,提升用户体验。...

    动态加载JS脚本的4种方法.doc

    本文将详细介绍四种动态加载JS脚本的方法,并探讨它们的工作原理和应用场景。 1. **直接使用`document.write`**: 这是最基础的动态加载方式,通过在JavaScript中使用`document.write`来插入包含`&lt;script&gt;`标签的...

    同步加载JS文件Demo

    "同步加载JS文件Demo"就是为了解决这一问题而设计的示例。 同步加载JavaScript意味着浏览器会暂停HTML解析,直到当前的脚本加载并执行完毕才会继续。这种方式保证了依赖关系的正确性,但可能会阻塞页面的渲染,如果...

    图片预加载js

    本文将深入探讨“图片预加载js”这一主题,包括预加载的原理、实现方式以及如何使用JavaScript来优化这个过程。 一、图片预加载的原理 图片预加载是指在用户实际看到图片之前,提前将图片数据加载到浏览器的缓存中...

    延迟加载js代码下载(包括页面延迟加载以及图片延迟加载)

    本篇文章将详细讲解延迟加载在JavaScript(js)和jQuery中的应用,以及如何实现页面和图片的延迟加载。 一、延迟加载的概念 延迟加载,也称为懒加载(Lazy Loading),是指在需要时才加载资源的技术。这种技术主要...

    js 异步加载js, css文件

    当项目js(css)文件使用越来越多,js 文件的加载也成了性能上的一个问题,此资源能够在页面全部加载完成后异步加载js等资源文件,它可以顺序加载资源列表,也可以并发加载资源列表,它包含一个方法调用接口:...

    动态加载外部JS文件

    动态加载外部JS文件是网页开发中的一个重要技术,它允许网页在需要时按需加载JavaScript资源,从而提高页面的加载速度,优化用户体验,并有效地管理复杂的项目结构。以下将详细阐述动态加载的原理、方法以及相关实践...

    android 加载应用js

    综上所述,解决Webview加载JS问题需要全面检查Webview的配置、网络环境、权限管理以及代码执行时机。通过细致的调试和合理的代码设计,我们可以有效地解决这类问题,实现Android应用与网页的顺畅交互。

    大图片分块加载JS代码

    这里假设有一个名为`js/main.js`的文件,用于处理图片的分块加载。首先,获取图片元素,并读取其`data-src`属性: ```javascript var imgElement = document.getElementById('myImage'); var imageUrl = imgElement...

    JQuery动态加载JS插件,很难找的哦

    要使用jQuery动态加载JS插件,我们首先需要一个触发加载事件的条件。这个条件可能是用户交互(如点击按钮)、页面滚动到特定位置,或者根据某些业务逻辑。以下是一个基本的示例,展示了如何在用户点击按钮时动态加载...

    vue动态加载外部依赖js代码实现

    - 本案例中,我们将通过创建一个名为`myScript.vue`的组件来封装动态加载JS文件的功能,使得该功能可以方便地被其他模块引用。 2. **动态加载JS文件的实现** - 在浏览器环境中,可以通过创建`&lt;script&gt;`标签并动态...

    页面延迟加载JS包 lazyload.js scrollloading.js

    "lazyload.js" 是一个专门用于延迟加载图片、视频和其他HTML元素的JavaScript库。它通过监听用户的滚动事件,判断元素是否进入视口,如果进入则加载相应的资源。这个库通常会替换原始的`src`属性为占位符,然后在...

    非常好的启动加载js模板

    启动加载js模板是专门为优化应用或网站的初始加载体验而设计的一种技术手段。当用户访问一个网页或者启动一个应用时,快速有效地展示内容是非常关键的,因为它直接影响到用户体验。下面我们将深入探讨启动加载js模板...

    延迟加载JS/CSS

    延迟加载(Lazy Load)是一种...7. **总结**:延迟加载JS和CSS是现代Web开发中的重要优化手段,它通过按需加载策略,平衡了用户体验、性能和资源消耗。理解并掌握这种技术,对于创建高性能、响应迅速的网站至关重要。

    html延迟加载JS和CSS

    在给定的文件`lazyLoadJC.js`中,可能实现了一个JavaScript库,用于延迟加载JS和CSS资源。这个库可能包含以下功能: 1. 检测浏览器兼容性,确保在IE6及更高版本上运行。 2. 针对JavaScript的延迟加载,可能使用了`...

    懒加载,滚动窗口加载,延迟加载js,jquery脚本demo

    在标题中提到的“延迟加载js,jquery脚本demo”,这表明提供的示例代码是使用jQuery库实现的JavaScript懒加载功能。jQuery是一个广泛使用的JavaScript库,简化了DOM操作、事件处理以及动画效果,对于实现懒加载这样...

Global site tag (gtag.js) - Google Analytics