<1>scrilpt标签方式

文档对象模型(DOM)允许你使用JavaScript 动态创建HTML的几乎全部文档内容。其根本在于,<script>元素与页面其他元素没有什么不同:引用变量可以通过DOM进行检索,可以从文档中移动、删除,也可以被创建.

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

新的<script>元素加载file1.js源文件。此文件当元素添加到页面之后立刻开始下载。此技术的重点在于:无论在何处启动下载,文件的下载和运行都不会阻塞其他页面处理过程。你甚至可以将这些代码放在<head>部分而不会对其余部分的页面代码造成影响(除了用于下载文件的HTTP 连接)。

当文件使用动态脚本节点下载时,返回的代码通常立即执行(除了Firefox和Opera,他们将等待此前的所有动态脚本节点执行完毕)。当脚本是“自运行”类型时这一机制运行正常,但是如果脚本只包含供页面其他脚本调用调用的接口,则会带来问题。这种情况下,你需要跟踪脚本下载完成并准备妥善的情况。可以使用动态<script>节点发出事件得到相关信息。

Firefox, Opera, Chorme, IE11+ 和Safari3+会在<script>节点接收完成之后发出一个load 事件。你可以监听这一事件,以得到脚本准备好的通知:

var script = document.createElement("script")
script.type = "text/javascript";
//Firefox, Opera, Chrome, Safari 3+
script.onload = function(){alert("Script loaded!");
};
script.src = "file1.js";
document.getElementsByTagName_r("head")[0].appendChild(script);

Internet Explorer(IE10及以下版本)支持另一种实现方式,它发出一个readystatechange事件。<script>元素有一个readyState属性,它的值随着下载外部文件的过程而改变。readyState 有五种取值:

  • uninitialized: 默认状态
  • loading: 下载开始
  • loaded: 下载完成
  • interactive: 下载完成但尚不可用
  • complete: 所有数据已经准备好

微软文档上说,在<script>元素的生命周期中,readyState 的这些取值不一定全部出现,但并没有指出哪些取值总会被用到。实践中,我们最感兴趣的是“loaded”和“complete”状态。Internet Explorer 对这两个readyState值所表示的最终状态并不一致,有时<script>元素会得到“loader”却从不出现“complete”,但另外一些情况下出现“complete”而用不到“loaded”。最安全的办法就是在readystatechange 事件中检查这两种状态,并且当其中一种状态出现时,删除readystatechange事件句柄(保证事件不会被处理两次):

var script = document.createElement("script")
script.type = "text/javascript";
//Internet Explorer
script.onreadystatechange = function(){if (script.readyState == "loaded" || script.readyState == "complete"){script.onreadystatechange = null;alert("Script loaded.");}
};
script.src = "file1.js";
document.getElementsByTagName_r("head")[0].appendChild(script);

大多数情况下,你希望调用一个函数就可以实现JavaScript 文件的动态加载。下面的函数封装了标准实现和IE 实现所需的功能:

function loadScript(url, callback){var script = document.createElement ("script")script.type = "text/javascript";if (script.readyState){ //IEscript.onreadystatechange = function(){if (script.readyState == "loaded" || script.readyState == "complete"){script.onreadystatechange = null;callback();}};} else { //Othersscript.onload = function(){callback();};}script.src = url;document.getElementsByTagName_r("head")[0].appendChild(script);
}

<2>异步加载js文件

在实际开发中,为了实现某种效果或者提升用户体验,往往需要控制何时加载js。本文总结了三个场景的js加载需求:在页面加载完成之后加载js,不同条件下动态加载不同的js,项目打包时的异步加载js模块。

一、在页面加载完成之后加载js

由于js的加载需要一定的时间,为了提高用户体验,可以先让页面元素呈现出来,然后在加载js文件。

<span style="color:#000000"><code><span style="color:#006666"><<span style="color:#4f4f4f">script</span> <span style="color:#4f4f4f">type</span>=<span style="color:#009900">"text/javascript"</span>></span>
$(document).ready(<span style="color:#000088">function</span><span style="color:#4f4f4f">()</span>{ <span style="color:#000088">var</span> userName=<span style="color:#009900">"xiaoming"</span>; alert(userName);
});
<span style="color:#006666"></<span style="color:#4f4f4f">script</span>></span> </code></span>

或者简写:

<span style="color:#000000"><code>$(<span style="color:#000088">function</span><span style="color:#4f4f4f">()</span>{
<span style="color:#000088">var</span> userName=<span style="color:#009900">"xiaoming"</span>;
alert(userName);
}); </code></span>

二、不同条件下动态加载不同的js

在不同条件下动态加载不同的js,当你的代码将在不同的环境中运行的时候,你需要他加载不同的js,一方面减少js的加载量,另一方面防止加载的两个js相互污染,所以要先判断环境,然后根据不同环境选择加载不同的js。这里举了个不恰当的例子,zepto和jquery,只是做个例子而已。

<span style="color:#000000"><code><span style="color:#000088">var</span> loadScript;
<span style="color:#000088">if</span>(isHomeEncironment){loadJS(<span style="color:#009900">"https://***/dist/js/public/zepto.min.js"</span>);loadScript.onload = <span style="color:#000088">function</span><span style="color:#4f4f4f">()</span> {<span style="color:#880000">//加载结束之后执行回调</span>loadScript.onload = <span style="color:#006666">null</span>;callAFun();<span style="color:#880000">//回调函数A</span>}
}<span style="color:#000088">else</span>{loadJS(<span style="color:#009900">"https://***/dist/js/public/jquery.js"</span>); loadScript.onload = <span style="color:#000088">function</span><span style="color:#4f4f4f">()</span> {<span style="color:#880000">//加载结束之后执行回调</span>loadScript.onload = <span style="color:#006666">null</span>;callBFun();  <span style="color:#880000">//回调函数B</span>}
}
<span style="color:#000088">function</span> <span style="color:#009900">loadJS</span><span style="color:#4f4f4f">(url)</span> {<span style="color:#880000">//加载js</span>loadScript = document.createElement(<span style="color:#009900">"script"</span>);loadScript.type = <span style="color:#009900">"text/javascript"</span>;loadScript.src = url;document.body.appendChild(loadScript);
}
<span style="color:#000088">function</span> <span style="color:#009900">callBFun</span><span style="color:#4f4f4f">()</span>{<span style="color:#880000">//zepto方法}  </span>
<span style="color:#000088">function</span> <span style="color:#009900">callBFun</span><span style="color:#4f4f4f">()</span>{<span style="color:#880000">//jquery方法} </span>
</code></span>

三、项目打包时的异步加载js模块

在commonjs中有一个Modules/Async/A规范,里面定义了require.ensure语法。webpack实现了它,作用是可以在打包的时候进行代码分片,并异步加载分片后的代码。用法如下:

<span style="color:#000000"><code><span style="color:#000088">require</span>.ensure([], <span style="color:#000088">function</span><span style="color:#4f4f4f">(require)</span>{<span style="color:#000088">var</span> <span style="color:#000088">list</span> = <span style="color:#000088">require</span>(<span style="color:#009900">'./list'</span>);<span style="color:#000088">list</span>.show();
}, <span style="color:#009900">'list'</span>);</code></span>

此时list.js会被打包成一个单独的chunk文件 list.fb874860b35831bc96a8.js。

require.ensure方法有三个参数,关于第一个参数,上例中传了空数组,如果传模块名称,则可以实现预加载懒执行,即当执行到这里时,js文件会加载到浏览器但是不会执行,真正执行的是list = require(‘./list’)list = require(‘./list’)。关于第三个参数,用于定义成成的js文件的名称,该参数不是必须的,如果没有第三个参数,那么生成的js文件为默认的名字

<3>网页里面动态添加js

常见的js动态加载技术之一是把一些逻辑独立的js脚本文件单独加载。这样做的好处是,比如可减少不必要的js脚本文件的加载,以提高网页浏览器的速度。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>动态加载js</title><script type="text/javascript">//动态加载js文件--my.jsfunction loadJs(){//得到html的头部domvar theHead = document.getElementsByTagName('head').item(0);//创建脚本的dom对象实例var myScript = document.createElement('script');myScript.src = './my.js';           //指定脚本路径myScript.type = 'text/javascript';  //指定脚本类型myScript.defer = true;              //程序下载完后再解析和执行theHead.appendChild(myScript);      //把dom挂载到头部}</script>
</head>
<body style="text-align:center"><p><input type="button" value="动态加载JS" onclick="loadJs()"/></p>
</body>
</html>

js代码:

var test = function(){alert("动态加载js文件");
}
test();

效果:

点击按钮之后,执行js代码片段。

解析:本例采用动态创建的方式来动态加载js,这是较为合理的一种方式。首先,创建一个js的DOM对象,然后,为它配置好脚本的地址和类型,最后把它挂载到网页的头部,也就是head部分。只有当用户单击“OK”按钮之后,“my.js”这个脚本文件才会被加载到网页中执行。

<4>使用js加载器加载外部的js文件

使用js加载器动态加载外部Javascript文件

  今天在网上找到了一个可以动态加载js文件的js加载器,具体代码如下:

JsLoader.js

 1 var MiniSite=new Object();2 /**3  * 判断浏览器4  */5 MiniSite.Browser={   6     ie:/msie/.test(window.navigator.userAgent.toLowerCase()),   7     moz:/gecko/.test(window.navigator.userAgent.toLowerCase()),   8     opera:/opera/.test(window.navigator.userAgent.toLowerCase()),   9     safari:/safari/.test(window.navigator.userAgent.toLowerCase())
10 };
11 /**
12  * JsLoader对象用来加载外部的js文件
13  */
14 MiniSite.JsLoader={
15     /**
16      * 加载外部的js文件
17      * @param sUrl 要加载的js的url地址
18      * @fCallback js加载完成之后的处理函数
19      */
20     load:function(sUrl,fCallback){
21         var _script=document.createElement('script');
22         _script.setAttribute('charset','gbk');
23         _script.setAttribute('type','text/javascript');
24         _script.setAttribute('src',sUrl);
25         document.getElementsByTagName('head')[0].appendChild(_script);
26         if(MiniSite.Browser.ie){
27             _script.onreadystatechange=function(){
28                 if(this.readyState=='loaded'||this.readyStaate=='complete'){
29                     //fCallback();
30                     if(fCallback!=undefined){
31                          fCallback();
32                     }
33
34                 }
35             };
36         }else if(MiniSite.Browser.moz){
37             _script.οnlοad=function(){
38                 //fCallback();
39                 if(fCallback!=undefined){
40                         fCallback();
41                 }
42             };
43         }else{
44             //fCallback();
45             if(fCallback!=undefined){
46                     fCallback();
47             }
48         }
49     }
50 };

JsLoader.js测试

 1 <!DOCTYPE HTML>2 <html>3   <head>4   <!--引入js加载器  -->5    <script type="text/javascript" src="js/JsLoader.js"></script>6     <title>JsLoaderTest.html</title>7     <script type="text/javascript">8         if(MiniSite.Browser.ie){9             //动态加载Js
10             MiniSite.JsLoader.load("js/jquery-1.9.1.js",function(){
11                 alert("动态加载的是jquery-1.9.1.js");
12                 $(function(){
13                     alert("jquery-1.9.1.js动态加载完成之后做的处理操作");
14                 });
15             });
16         }else{
17             MiniSite.JsLoader.load("js/jquery-2.0.3.js",function(){
18                 alert("动态加载的是jquery-2.0.3.js");
19                 $(function(){
20                     alert("jquery-2.0.3.js动态加载完成之后做的处理操作");
21                 });
22             });
23         }
24     </script>
25   </head>
26
27   <body>
28
29   </body>
30 </html>

测试结果如下:

IE浏览器下测试结果:

google浏览器下的测试结果:

web动态添加js外部文件方式相关推荐

  1. asp.net后台代码动态添加JS文件和css文件的引用

    首先添加命名空间 using System.Web.UI.HtmlControls; 代码动态添加css文件的引用 HtmlGenericControl myCss = new HtmlGeneric ...

  2. 静态html js文件上传,js实现动态添加上传文件页面

    发邮件是需要添加一些文件,每添加一个文件,页面上可以显示一个表单文件上传选项. 此功能为:初始时刻只有一个添加按钮,当点击添加文件时,会增加一个选择文件和删除区域,同时显示上传按钮,当点击删除,此行选 ...

  3. js 外部文件加载处理

    概述 前端在日常工作中很大一部分时间是在思考页面的优化方案,让页面载入得更快.鉴于javascript是单线程的事件驱动语言,优化工作之一就是:控制图片.swf.iframe等大流量文件以及js和cs ...

  4. ASP.NET页面动态添加js脚本

    有时我们需要生成自己的JavaScript代码并在运行时动态添加到页面,接下来我们来看一下如何将生成的JavaScript代码动态添加到ASP.NET页面. 为了添加脚本,要将自定义的脚本在一个字符串 ...

  5. html5表单动态添加,js动态添加表单实例

    前段时间因为域名关系网站停了一段时间.别的不多说了,我前端结合php做一个批量建栏目的模块,用到这个 对了下点,这个添加input动态添加 name也是可设成不同有,我用的是"text&qu ...

  6. es ik 词库添加词语_ElasticSearch-IK拓展自定义词库(1):手动添加热词文件方式...

    IK分词器作为一个开源软件,分词功能非常强大,一般场合的分词需求,他都可以完胜.但是对于专业术语和行业用词,ik有点不太智能,不过IK已经很棒了!下面我就介绍下如何手动添加热词文件的形式来拓展ik认知 ...

  7. 在Winform中菜单动态添加“最近使用文件”

    最近在做文件处理系统中,要把最近打开文件显示出来,方便用户使用.网上资料有说,去遍历"C:\Documents and Settings\Administrator\Recent" ...

  8. 慕容小匹夫 Unity3D移动平台动态读取外部文件全解析

    Unity3D移动平台动态读取外部文件全解析 c#语言规范 阅读目录 前言: 假如我想在editor里动态读取文件 移动平台的资源路径问题 移动平台读取外部文件的方法 补充: 回到目录 前言: 一直有 ...

  9. 匹夫细说Unity3D(一)——移动平台动态读取外部文件全解析

    前言: 一直有个想法,就是把工作中遇到的坑通过自己的深挖总结成一套相同 问题 的解决方案供各位同行拍砖探讨.眼瞅着2015年第一个工作日就要来到了,小匹夫也休息的差不多了,寻思着也该写点东西活动活动大 ...

最新文章

  1. SQL Server 2005 连接本地端口1433开启远程连接/登陆18456错误的解决方法
  2. ios使用自带git respository管理项目
  3. 基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)
  4. 静态优先权和动态优先权
  5. 【OpenCV 例程200篇】01. 图像的读取(cv2.imread)
  6. 软件设计师-数据库( 分布式)
  7. 设计模式(1)单例模式(Singleton)
  8. js调用后台,后台调用前台等方法总结
  9. SqlServer2008R2 完全卸载步骤
  10. Pandas参考手册、常用函数及方法汇总
  11. linux 物理内存 查看,Linux查看物理内存信息
  12. 使用rufus制作windows系统安装u盘
  13. 精通cobol--9.3.1 OCCURS语句的使用方法
  14. 微信抢红包神器自动抢软件
  15. ElasticSearch之搜索词提示Sug
  16. 国内首家!网易易盾加固第一时间适配Android Q Beta
  17. 一篇文章带你吃透VUE响应式原理
  18. Google Earth Engine(GEE)——全球影像数据正确下载方式和注意事项
  19. Openstack_Nova部署(t版)
  20. 74系列 LS 与 HC 区别

热门文章

  1. 使用域名转发mqtt协议,避坑指南
  2. 17.6 unique_lock详解
  3. 【IT运维】传统运维与云运维到底有什么不同呢?
  4. Adobefirefly萤火虫下载使用体验和如何申请教程
  5. Linux:如何通过端口号查找进程号?
  6. 微软向小米出售1500项专利,建立长期合作伙伴关系
  7. sqlcmd 实用工具
  8. 数据序列相关性-ACF,PACF和CCF
  9. IDEA打包jar包含第三方jar包(自测正确步骤)
  10. VMware中Linux的ens33没有IP地址解决办法