动态载入js提高网页打开速度的方法


Posted in Javascript onJuly 04, 2014

一般来说如果一次性的载入所有需要的JavaScript代码,就会造成初始网页打开速度变慢,但是很多载入的代码又并不需要使用,这种无谓的性能浪费应该予以避免。如果要动态载入JavaScript代码,可以利用DOM模型在HTML文档中添加<script>结点,并将此结点的src属性(即 外联 Javascript文件)设置为需要动态载入的JavaScript代码。

下面就是完成这样功能的一个示例:

(1)、新建JsLoaderTest.html文件

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<title>按需载入JavaScript代码的例子</title> 
<script type="text/javascript"> 
  function JsLoader(){ 
  this.load=function(url){ 
      //获取所有的<script>标记 
      var ss=document.getElementsByTagName("script"); 
      //判断指定的文件是否已经包含,如果已包含则触发onsuccess事件并返回 
      for (i=0;i<ss.length;i++){ 
        if (ss[i].src && ss[i].src.indexOf(url)!=-1){ 
          this.onsuccess(); 
          return; 
        } 
      } 
      //创建script结点,并将其属性设为外联JavaScript文件 
      s=document.createElement("script"); 
      s.type="text/javascript"; 
      s.src=url; 
      //获取head结点,并将<script>插入到其中 
      var head=document.getElementsByTagName("head")[0]; 
      head.appendChild(s); 
      //获取自身的引用 
      var self=this; 
      //对于IE浏览器,使用readystatechange事件判断是否载入成功 
      //对于其他浏览器,使用onload事件判断载入是否成功 
      //s.onload=s.onreadystatechange=function(){ 
      s.onload=s.onreadystatechange=function(){ 
        //在此函数中this指针指的是s结点对象,而不是JsLoader实例, 
        //所以必须用self来调用onsuccess事件,下同。 
        if (this.readyState && this.readyState=="loading") return; 
        self.onsuccess(); 
      } 
      s.onerror=function(){ 
        head.removeChild(s); 
        self.onfailure(); 
      } 
    }; 
    //定义载入成功事件 
    this.onsuccess=function(){}; 
    //定义失败事件 
    this.onfailure=function(){}; 
  } 
  function btnClick(){ 
      //创建对象 
    var jsLoader=new JsLoader(); 
    //定义载入成功处理程序 
    jsLoader.onsuccess=function(){ 
       sayHello(); 
    } 
    //定义载入失败处理程序 
    jsLoader.onfailure=function(){ 
       alert("文件载入失败!"); 
    } 
    //开始载入 
    jsLoader.load("hello.js"); 
  } 
</script> 
</head> 
<body> 
<label> 
<input type="submit" name="Submit" onClick="javascript:btnClick()" value="载入JavaScript文件"> 
</label> 
</body> 
</html>

(2)、新建hello.js文件,包含如下代码:

// JavaScript Document 
function sayHello(){ 
  alert("Hello World!成功载入JavaScript文件");   
} 
// JavaScript Document
function sayHello(){
  alert("Hello World!成功载入JavaScript文件");  
}
Javascript 相关文章推荐
jQuery 自动增长的文本输入框实现代码
Apr 02 Javascript
通过百度地图获取公交线路的站点坐标的js代码
May 11 Javascript
用js代码改变单选框选中状态的简单实例
Dec 18 Javascript
JavaScript实现cookie的写入、读取、删除功能
Nov 05 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
Dec 18 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
Aug 05 Javascript
Bootstrap缩略图与警告框学习使用
Feb 08 Javascript
jQuery Chosen通用初始化
Mar 07 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
Jul 07 Javascript
微信小程序新手教程之页面打开数量限制
Mar 03 Javascript
vue实现员工信息录入功能
Jun 11 Javascript
JavaScript 实现轮播图特效的示例
Nov 05 Javascript
JS中getYear()和getFullYear()区别分析
Jul 04 #Javascript
兼容IE、firefox以及chrome的js获取时间(getFullYear)
Jul 04 #Javascript
JS根据年月获得当月天数的实现代码
Jul 03 #Javascript
js实现局部页面打印预览原理及示例代码
Jul 03 #Javascript
window.returnValue使用方法示例介绍
Jul 03 #Javascript
基于javascript的JSON格式页面展示美化方法
Jul 02 #Javascript
jQuery窗口、文档、网页各种高度的精确理解
Jul 02 #Javascript
You might like
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
php实现按天数、星期、月份查询的搜索框
2016/05/02 PHP
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
PHP配置ZendOpcache插件加速
2019/02/14 PHP
一次因composer错误使用引发的问题与解决
2019/03/06 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
jQuery简单设置文本框回车事件的方法
2016/08/01 Javascript
详解JavaScript中的属性和特性
2016/12/08 Javascript
利用node.js本地搭建HTTP服务器
2017/04/19 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
2017/11/03 Javascript
解决option标签selected=&quot;selected&quot;属性失效的问题
2017/11/06 Javascript
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
NodeJS实现不可逆加密与密码密文保存的方法
2018/03/16 NodeJs
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
Python文件读写常见用法总结
2019/02/22 Python
如何使用Flask-Migrate拓展数据库表结构
2019/07/24 Python
PyCharm 2019.3发布增加了新功能一览
2019/12/08 Python
关于Tensorflow分布式并行策略
2020/02/03 Python
python爬虫库scrapy简单使用实例详解
2020/02/10 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
Python3合并两个有序数组代码实例
2020/08/11 Python
HTML5 Web缓存和运用程序缓存(cookie,session)
2018/01/11 HTML / CSS
加拿大女鞋品牌:ALDO
2016/11/13 全球购物
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
Anthropologie英国:美国家喻户晓的休闲服装和家居产品品牌
2018/12/05 全球购物
建筑工程技术专业求职信
2014/07/16 职场文书
2014教师党员自我评议(5篇)
2014/09/20 职场文书
2019年暑期法院实习报告
2019/12/18 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers