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

动态加载script文件

 
阅读更多

动态加载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'并不能工作的很好,理论上状态的变化是如下步骤:
0 uninitialized
1 loading
2 loaded
3 interactive
4 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>");

分享到:
评论

相关推荐

    vue如何实现动态加载脚本

    今天在研究,tinymce富文本编辑器怎样在vue中使用,然后看到其它框架上的使用方法,它是动态加载tinymce脚本的,若果在本地引入静态文件或者,npm安装都会导致vue项目打包体积过大,这种动态脚本引入方式,是一个...

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

    动态加载script到页面大约有俩方法 第一种就是利用ajax方式,把script文件代码从后台加载到前台,然后对加载到的内容通过eval&#40;&#41;执行代码。第二种是,动态创建一个script标签,设置其src属性,通过把script...

    vue动态加载js.zip

    vue动态加载JavaScript:动态的创建Script元素,然后通过更改它的 src 属性来加载脚本,脚本文件加载完成后,在脚本加载完成生效后才能执行回调函数。

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

    本文档把js加载做成vue组件,便于在其他模块引用,符合vue整体思路,供大家参考借鉴

    使用javaScript动态加载Js文件和Css文件

    (1)使用JavaScript动态加载Js文件 /*JavaScript动态加载Js文件*/ var scriptNode = document.createElement('script'); scriptNode.src = 'proxy.js?t='+new Date().getTime();/*附带时间参数,防止缓存*/ ...

    Vue中通过<script></script>引入的Vue.js文件

    src里面的内容根据自己的下载的Vue.js的文件位置决定的,我这里只是拿我自己做的举个例子。这个地方的vue.js是因为我下载了两次这个版本的vue.js才导致这样的。但是引入是没有任何问题的。 Vue、js版本这个是根据...

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

    第一种便是利用ajax方式,把script文件代码从背景加载到前台,而后对加载到的内容经过eval&#40;&#41;实施代码。第二种是,动静创建一个script标签,配置其src属性,经过把script标签插入到页面head来加载js,相当于...

    jquery及js实现动态加载js文件的方法

    本文实例讲述了jquery及js实现动态加载js文件的方法。分享给大家供大家参考,具体如下: 问题: 如果用jquery append直接加载script标签的话,会报错的。除了[removed]外,还有没有其他的比较好的动态加载js文件的...

    JavaScript动态插入script的基本思路及实现函数

    在日常的前端开发中,偶尔有需要动态插入javascript代码的需求,基本思路是: 1、动态创建一个script标签,设置其src属性,type属性等 2、将script节点插入页面,加载js文件 即相当于将[removed][removed]添加到了...

    详谈LABJS按需动态加载js文件

    LABjs 是一个很小的 JavaScript 工具,用来根据需要加载 JavaScript 文件,通过使用该工具可以提升页面的性能,避免加载不需用到的 JavaScript 文件,可以实现动态并行加载脚本文件,以及管理加载脚本文件的执行顺序...

    msscript.ocx控件

    3、Windows XP/WIN7/win10系统(64位系统对应64位dll文件,32位系统对应32位dll文件),将msscript.ocx复制到C:\Windows\System32目录下。 4、如果您的系统是64位的请将32位的dll文件复制到C:\Windows\SysWOW64目录...

    动态加载js文件简单示例

    本文实例讲述了动态加载js文件的方法。分享给大家供大家参考,具体如下: function loadScript(url){ var hd = document.getElementsByTagName('head')[0], js = document.createElement('script'); js.src = url; ...

    同步异步动态引入js文件的几种方法总结

    动态加载js文件 有时候我们需要根据参数不同来引入不同的js文件,用html直接写标签满足不了我们的需求,总结几种方法,以及同步异步加载的各种需求 一.直接加载 &lt;div id=divId&gt;&lt;/div&gt; [removed] 二.异步加载,并发...

    groovy-loader:在文件目录中动态加载Groovy脚本

    groovy-loader load groovy scripts in file directory dynamically ...spring配置文件使用标签lang:groovy,通过指定script-source来加载指定路径下的groovy脚本,通过refresh-check-delay属性来定时

    原生JS实现动态加载js文件并在加载成功后执行回调函数的方法

    有的时候需要动态加载一个javascript文件,并且在加载成功后执行回调函数(例如文件中保存了json数据之类的)。要实现这样的功能,可以使用[removed] 元素的load 事件(IE9+、chrome、FireFox等)和...

    异步加载script的代码

    通过iframe 异步加载script 通过异步请求另一页面的script 是不执行的,只返回html 原文件,因为返回的文本没有经过浏览器的解析执行。 看代码 a1.html 代码如下: &lt;html xmlns=”http://www.w3.org/1999/xhtml”...

    groovy-loader-v2:在文件目录中动态加载Groovy脚本

    动态加载指定目录下的groovy脚本,并将其注册为groovy bean,放置于ApplicationContext容器中,并使用命名空间进行分类区分(一个namespace对应于一个ApplicationContext)。同时能够动态感知到groovy脚本的新增、修改...

    async和DOM Script文件加载比较

    目前我用demo.js作为执行文件操作.代码: var now = function() { return +(new Date());...1. 一般script标签加载 [removed][removed] [removed][removed] 在浏览器加载情况: 图1-1. 下载阻塞DomReady 图1-2

Global site tag (gtag.js) - Google Analytics