两种动态加载JavaScript文件的方法

两种动态加载JavaScript文件的方法

第一种便是利用ajax方式,第二种是,动静创建一个script标签,配置其src属性,经过把script标签拔出到页面head来加载js,感乐趣的网友可以看下

动态加载script到页面大约有俩方法

第一种便是利用ajax方式,把script文件代码从背景加载到前台,而后对加载到的内容经过eval()实施代码。第二种是,动静创建一个script标签,配置其src属性,经过把script标签插入到页面head来加载js,相当于正在head中写了一个<script src="..."></script>,只可是这个script标签是用js动静创建的
比喻说是我们要动静地加载一个callbakc.js,我们就必要多么一个script标签:

代码如下:

<script type="text/javascript" src="call.js"></script> 

如下代码就是如何通过js来创建这个标签(并且加到head中):

代码如下:

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

当加载完call.js, 我们就要调用其中的方法。不过在header.appendChild(script)之后我们不能马上调用其中的js。因为浏览器是异步加载这个js的,我们不知道他什么时候加载完。然而我们可以通过监听事件的办法来判断helper.js是否加载完成。(假设call.js中有一个callback方法) 代码如下:

var head= document.getElementsByTagName(‘head‘)[0];
var script= document.createElement(‘script‘);
script.type= ‘text/javascript‘;
script.onreadystatechange= function () {
if (this.readyState == ‘complete‘)
callback();
}
script.onload= function(){
callback();
}
script.src= ‘helper.js‘;
head.appendChild(script); 

我设了2个事件监听函数, 因为在ie中使用onreadystatechange, 而gecko,webkit 浏览器和opera都支持onload。事实上this.readyState == ‘complete‘并不能工作的很好,理论上状态的变化是如下步骤:

  1. uninitialized
  2. loading
  3. loaded
  4. interactive
  5. complete

但是有些状态会被跳过。根据经验在ie7中,只能获得loaded和completed中的一个,不能都出现,原因也许是对判断是不是从cache中读取影响了状态的变化,也可能是其他原因。最好把判断条件改成this.readyState == ‘loaded‘ || this.readyState == ‘complete‘

参考jQuery的实现我们最后实现为: 代码如下:

var head= document.getElementsByTagName(‘head‘)[0];
var script= document.createElement(‘script‘);
script.type= ‘text/javascript‘;
script.onload = script.onreadystatechange = function() {
if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete" ) {
help();
// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
} };
script.src= ‘helper.js‘;
head.appendChild(script); 

还有一种简单的情况就是可以把help()的调用写在helper.js的最后,那么可以保证在helper.js在加载完后能自动调用help(),当然最后还要能这样是不是适合你的应用。

另外需要注意:

1.因为script标签的src可以跨域访问资源,所以这种方法可以模拟ajax,解决ajax跨域访问的问题。
2.如果用ajax返回的html代码中包含script,则直接用innerHTML插入到dom中是不能使html中的script起作用的。粗略的看了下jQuery().html(html)的原代码,jQuery也是先解析传入的参数,剥离其中的script代码,动态创建script标签,所用jQuery的html方法添加进dom的html如果包含script是可以执行的。如:

jQuery("#content").html("<script>alert(‘aa‘);<\/script>"); 

时间: 2024-10-26 21:41:08

两种动态加载JavaScript文件的方法的相关文章

unity 3D里有两种动态加载机制

unity 3D里有两种动态加载机制: 一是Resources.Load: 一是通过AssetBundle: 其实两者本质上没有什么区别.Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时动态加载,可以指定路径和来源的.其实场景里所有静态的对象也有这么一个加载过程,只是Unity后台替你自动完成了. 1.    AssetBundles是什么? 在一些大型的网络游戏,或者加载比较多的一些场景时,如果要等

jQuery_动态加载css文件实现方法

有时我们可能会需要使用 jQuery 来加载一个外部的 css 文件,如在切换页面布局时.思路是创建一个 link 元素,并将它添加到 标记中即可,下边首先看看怎么使用 jQuery 来实现. 下边是我喜欢的写法: ? 1 2 3 4 5 6 $("<link>") .attr({ rel: "stylesheet", type: "text/css", href: "site.css" }) .appendTo(

AngularCSS--关于angularjs动态加载css文件的方法(仅供参考)

AngularCSS CSS on-demand for AngularJS Optimize the presentation layer of your single-page apps by dynamically injecting stylesheets as needed. AngularCSS listens for route (or states) change events, adds the CSS defined on the current route and remo

jQuery动态加载css文件实现方法

$("<link>").attr({ rel: "stylesheet",type: "text/css",href: "site.css"}).appendTo("head"); 一个完整的实例: <html> <head> <script type="text/javascript" src="http://ajax.googlea

jquery如何动态加载js文件

jquery如何动态加载js文件:本章节和大家分享一下几种动态加载js文件的方法,希望能够给需要的朋友带来帮助.方法一: $.getscript("test.js"); 方法二: function loadjs(file) { var head = $('head').remove('#loadscript'); $("<scri"+"pt>"+"</scr"+"ipt>").att

Java中动态加载jar文件和class文件

概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下的jar文件以及classes目录下的class文件,另外像spring这类框架,也可以根据指定的路径扫描并加载指定的类文件,这个技术可以实现一个容器,容纳各类不同的子应用. Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,不像C加载动态链接库只要一个文件名就可以搞定,但JDK仍提供了一整套方法来动态加载jar文件和class文件. 动态加载jar文件 // 系统类库路径 File libPath =

动态加载JavaScript

动态加载JavaScript减少不必要的文件加载,提高网页浏览速度 <!DOCTYPE html> <html><meta charset='utf8'><body> <input type='button' value='动态加载JavaScript' onclick='loadJS()'> </body><script> var htmlcollection=document.getElementsByTagName(

为了提高性能,如何动态加载JS文件

超级表格是一款多人协作的在线表格,程序相当复杂,用到十几个JS文件.但是有些文件是在打开某些类型的表格时才需要加载. 例如,只有当打开甘特图表格时,才需要加载gantetu.js文件. 那么问题来了,为了减少js文件数量和请求,如何在需要时自动加载js文件呢? 办法如下. //动态加载js文件function mcss_importJS(js){ var oHead = document.getElementsByTagName('HEAD').item(0); var oScript= doc

Java_Java中动态加载jar文件和class文件

转自:http://blog.csdn.net/mousebaby808/article/details/31788325 概述 诸如tomcat这样的服务器,在启动的时候会加载应用程序中lib目录下的jar文件以及classes目录下的class文件,另外像spring这类框架,也可以根据指定的路径扫描并加载指定的类文件,这个技术可以实现一个容器,容纳各类不同的子应用. Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,不像C加载动态链接库只要一个文件名就可以搞定,但JDK仍