解决HTML加载时,外部js文件引用较多,影响页面打开速度问题

 

通常HTML文件在浏览器中加载时,浏览器都会按照<script>元素在页面中出现的先后顺序,对它们依次加载,一旦加载的js文件数量过多,就会导致页面展示延迟。那么,在开发的过程中,改怎么解决呢?

首先,我们看一看传统中js加载的做法,所有的<script>元素都应该放在页面的<head>元素中,例如:

  1.  
    <!DOCTYPE html>
  2.  
    <html>
  3.  
    <head>
  4.  
    <title>HTML js应用</title>
  5.  
    <meta http-equiv="Content-type" content="text/html; charset=GBK"></meta>
  6.  
    <script type="text/javascript" src="example1.js"></script>
  7.  
    <script type="text/javascript" src="example2.js"></script>
  8.  
    </head>
  9.  
     
  10.  
    <body>
  11.  
    <div>
  12.  
    <h1>好好学习,天天向上</h1>
  13.  
    </div>
  14.  
    </body>
  15.  
    </html>

这种做法的目的就是把所用的外部文件(包括CSS文件和js文件)的引用都放在相同的地方。可是,在文档的<head>元素中包含所有JavaScript文件,意味着必须等到全部JavaScript代码都被下载、解析和执行完成以后,才能开始呈现页面的内容。而对于需要很多JavaScript文件的页面来说,无疑会出现页面展示延迟现象。下面我给出3种解决方案:

方案一、改变标签的位置

 

我们把<script>元素引用放在<body>元素中,如下例所示:

  1.  
    <!DOCTYPE html>
  2.  
    <html>
  3.  
    <head>
  4.  
    <title>HTML js应用</title>
  5.  
    <meta http-equiv="Content-type" content="text/html; charset=GBK"></meta>
  6.  
    </head>
  7.  
     
  8.  
    <body>
  9.  
    <div>
  10.  
    <h1>好好学习,天天向上</h1>
  11.  
    </div>
  12.  
    <script type="text/javascript" src="example1.js"></script>
  13.  
    <script type="text/javascript" src="example2.js"></script>
  14.  
    </body>
  15.  
    </html>

这样,在解析包含的JavaScript代码之前,页面的内容将完全展示在浏览器中。而用户也会因为浏览器窗口显示空白页面的时间缩短而感到打开的速度加快了。

方案二、在<script>元素中加延迟脚本

 

HTML4.01为<script>标签定义了defer属性。这个属性的用途是表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面解析完成后再运行。因此,在<script>元素中设置defer属性,相当于告诉浏览器立即下载,但延迟执行。下面看代码实现:

  1.  
    <!DOCTYPE html>
  2.  
    <html>
  3.  
    <head>
  4.  
    <title>HTML js应用</title>
  5.  
    <meta http-equiv="Content-type" content="text/html; charset=GBK"></meta>
  6.  
    <script type="text/javascript" defer="defer" src="example1.js"></script>
  7.  
    <script type="text/javascript" defer="defer" src="example2.js"></script>
  8.  
    </head>
  9.  
     
  10.  
    <body>
  11.  
    <div>
  12.  
    <h1>好好学习,天天向上</h1>
  13.  
    </div>
  14.  
    </body>
  15.  
    </html>

在这个例子中,虽然我们把<script>元素放在了文档的<head>元素中,但其包含的脚本将延迟到浏览器遇到</html>标签后再执行。HTML5规范要求脚本按照它们出现的先后顺序执行加载。

方案三、在<script>元素中加异步脚本

HTML5为<script>元素定义了async属性,这个属性与defer属性类似,都用于改变处理脚本的行为。async与defer类似,只适用于外部脚本文件,并告诉浏览器立即下载文件。但与defer不同的是,标记为async的脚本并不保证按照指定它们的先后顺序执行。如下例:

  1.  
    <!DOCTYPE html>
  2.  
    <html>
  3.  
    <head>
  4.  
    <title>HTML js应用</title>
  5.  
    <meta http-equiv="Content-type" content="text/html; charset=GBK"></meta>
  6.  
    <script type="text/javascript" async src="example1.js"></script>
  7.  
    <script type="text/javascript" async src="example2.js"></script>
  8.  
    </head>
  9.  
     
  10.  
    <body>
  11.  
    <div>
  12.  
    <h1>好好学习,天天向上</h1>
  13.  
    </div>
  14.  
    </body>
  15.  
    </html>

在XHTML文档中,要把async属性设置为async="async"。

解决HTML加载时,外部js文件引用较多,影响页面打开速度问题的更多相关文章

  1. JQuery 加载 CSS、JS 文件

    JS 方式加载 CSS.JS 文件: //加载 css 文件 function includeCss(filename) { var head = document.getElementsByTagN ...

  2. 使用getScript()方法异步加载并执行js文件

    使用getScript()方法异步加载并执行js文件 使用getScript()方法异步请求并执行服务器中的JavaScript格式的文件,它的调用格式如下所示: jQuery.getScript(u ...

  3. 解决加载WEB页面时,由于JS文件引用过多影响页面打开速度的问题

    1.一般做法 一般我们会把所有的<script>元素都应该放在页面的<head>标签里,但由于是顺序加载,因此只有当所有JavaScript代码都被依次下载.解析和执行完之后, ...

  4. 用JavaScript动态加载CSS和JS文件

    本文转载自:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/11/14/2248451.html 今天项目中需要用到动态加载 CSS 文件 ...

  5. 通过特殊处理 Resize 事件解决 WinForm 加载时闪烁问题的一个方法

    WinForm 上放置的控件多了或者有大背景图,窗体加载时就会闪烁,对于一般的闪烁,设置 DoubleBuffer=True或许有一点改善,要立竿见影的解决可以重载 CreateParams 使用 W ...

  6. android报错及解决1--Bitmap加载时,报bitmap size exceeds VM budget

    报错描述: 用Bitmap加载图片资源时,报错java.lang.OutOfMemoryError: bitmap size exceeds VM budget 原因分析: android系统限制,只 ...

  7. 火狐浏览器怎么查看页面加载了那些js文件,那系js文件有作用

    方法一: 右击查看原代码,点击js链接如果能够看到文件内容,证明加载成功 方法二: 按F12键,如果控制台没有加载错误,证明加载成功:

  8. JavaScript动态加载CSS和JS文件

    var dynamicLoading = { css: function(path){ if(!path || path.length === 0){ throw new Error('argumen ...

  9. 动态加载CSS,JS文件

    var Head = document.getElementsByTagName('head')[0],style = document.createElement('style'); //文件全部加 ...

随机推荐

  1. mysql慢日志

    mysql慢日志是用来记录执行时间比较长的sql工具(超过long_query_time的sql),这样对于跟踪有问题的sql很有帮助. 查看是否启用慢日志和相关信息 上面截图其中: log_slow ...

  2. C++中的常量定义

    本篇笔记总结自一次代码检视. 一般来说,使用C语言编程时我们都习惯在代码当中使用C当中的宏定义来定义一个数值常量: #define MY_CONST 7 在C++开发项目时,也会经常存在沿袭C当中常量 ...

  3. http之工作原理

    HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端.HTTP协议采用了请求/响应模型.客户端向服务器发送一个请求报文,请求报文包含请求的方法.URL. ...

  4. zoj3822

    这题说得是给了一个n*m的棋盘,每天在这个棋盘中放置一个棋子,不能放在之前已经摆放过得地方,求最后使得每行每列都有至少一个棋子的期望天数是多少,这样我们考虑怎么放,放哪里,显然数据大而且不知道状态怎么 ...

  5. ng-深度学习-课程笔记-6: 建立你的机器学习应用(Week1)

    1 训练/验证/测试集( Train/Dev/test sets ) 构建神经网络的时候有些参数需要选择,比如层数,单元数,学习率,激活函数.这些参数可以通过在验证集上的表现好坏来进行选择. 前几年机 ...

  6. 使用MongoVUE无法添加Collection

    说明: 问题MongoDB版本为3.2,MongoVUE 1.6.9 问题: 在数据库中添加集合不可用. 解决方法: MongoDB版本换成2 或者 切换存储引擎: 从MongoDB 3.2 版本开始 ...

  7. HDU 4725 The Shortest Path in Nya Graph(最短路建边)题解

    题意:给你n个点,m条无向边,每个点都属于一个层,相邻层的任意点都能花费C到另一层任意点,问你1到n最小路径 思路:没理解题意,以为每一层一个点,题目给的是第i个点的层数编号.这道题的难点在于建边,如 ...

  8. java学习之浅谈多线程3--线程间协作

    通过保证临界区上多个线程的相互排斥,线程同步完全可以避免竞争状态的发生,但是有时还需要线程之间的协作.有两种方式可用于线程间的通信. 1.使用条件Condition Condition接口: +awa ...

  9. shell 判断是否是目录

    创建一个文件和一个文件夹 touch sss mkdir d test.sh #!/bin/bash echo "enter the name:" read filename if ...

  10. lapply

    正如前面展示的,lapply( )函数接收一个向量和一个函数作为输入参数.它将这个函数应用到向量中的每个元素,再将结果以列表的形式返回.当每次迭代都是相互独立时,这个函数就非常好用.因为在这种情况下, ...