动态加载JS脚本
建立dynamic.js文件,表示动态加载的js文件,里面的内容为:
function dynamicJS() {
alert("加载完毕");
}
如下方法中的html页面和dynamic.js文件在一个目录下。
一. document.write()


<html lang="en">
<head>
<meta charset="UTF-8">
<title>Dynamic load JS</title>
<script>
function init() {
document.write('<script src="dynamic.js"><\/script>');
document.write('<input type="button" onclick="load();" value="加载完毕" \/>');
}
dynamicJS(); //此处报错,由于dynamic.js文件还未加载完毕
function load() {
dynamicJS();
}
</script>
</head>
<body>
<input type="button" onclick="init();" value="初始化加载" />
<!--<input type="button" onclick="load();" value="加载完毕">-->
</body>
</html>
问题,1,document.write会重写页面,在点击初始化加载按钮后,页面重绘导致原有的内容丢失,上述代码中注释掉的”加载完毕“按钮会丢失,因此需要在init函数中使用document.write的方式建立一个按钮。
问题2,异步加载,直接调用dynamicJS方法会报错,因为js文件未加载完毕,而在其后的代码已经开始运行。
综上,此种方法不推荐。
二. 动态改变已有script的src属性


<html lang="en">
<head>
<meta charset="UTF-8">
<title>Dynamic load JS</title>
<script id="abc" src=""></script>
<script>
function init() {
abc.src = "dynamic.js";
dynamicJS(); //此处调用报错,由于还未加载完毕
}
function load() {
dynamicJS();
}
</script>
</head>
<body>
<input type="button" onclick="init();" value="初始化加载" />
<input type="button" onclick="load();" value="加载完毕">
</body>
</html>
这个代码运行起来有问题,点击”加载完毕“按钮还是报"Uncaught ReferenceError: dynamicJS is not defined"
问题:异步加载问题
三. 动态创建script元素


<html lang="en">
<head>
<meta charset="UTF-8">
<title>Dynamic load JS</title>
<script>
function init() {
var myScript = document.createElement('script');
myScript.src = 'dynamic.js';
document.body.appendChild(myScript);
dynamicJS(); //此处调用报错,由于还未加载完毕
}
function load() {
dynamicJS();
}
</script>
</head>
<body>
<input type="button" onclick="init();" value="初始化加载" />
<input type="button" onclick="load();" value="加载完毕">
</body>
</html>
问题:相对于第二种方式,不需要在页面上一开始就添加script元素,但同样存在异步加载问题。
前三种方法共同点:异步执行,加载这些脚本的同时,主页面的脚本继续运行。若此时调用未加载完成的JS中的代码,会报错。
四. XMLHttpRequest/ActiveXObject 同步加载


<html lang="en">
<head>
<meta charset="UTF-8">
<title>Dynamic load JS</title>
<script>
function init() {
ajaxPage('abc', 'dynamic.js');
dynamicJS();
}
function ajaxPage(sId, url) {
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject();
xhr.open('GET', url, false); //同步加载
xhr.send(null);
// xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
//0代表访问本地资源,200代表访问服务器成功,304代表没做修改,访问缓存
if(xhr.status == 200 || xhr.status == 0 || xhr.status == 304 ) {
includeJS(sId, xhr.responseText);
}
}
// }
}
function includeJS(sId, source) {
if(source != null && (!document.getElementById(sId))) {
var myHead = document.getElementsByTagName('head')[0];
var myScript = document.createElement('script');
myScript.id = sId;
try {
myScript.appendChild(document.createTextNode(source));
} catch(ex) {
myScript.text = source;
}
myHead.appendChild(myScript);
}
}
</script>
</head>
<body>
<input type="button" onclick="init();" value="测试按钮" />
</body>
</html>
参考链接:http://www.cnblogs.com/zhuimengdeyuanyuan/archive/2013/03/06/2946277.html
动态加载JS脚本的更多相关文章
- 动态加载JS脚本的4种方法
实现OPOA(One Page One Application)时,必须使用动态加载js. 也就是在用户选择某个菜单项后,再动态加载对应的全部js到客户端. 动态加载js的情况很多啊,比如解决ajax ...
- 使用jQuery动态加载js脚本
动态加载Javascript是一项非常强大且有用的技术.这方面的主题在本站已经讨论了不少,我也经常会在一些个人项目上使用RequireJS和Dojo加载js.它们很强大,但有时候也会得不偿失.如果你使 ...
- 使用jQuery动态加载js脚本文件的方法
动态加载Javascript是一项非常强大且有用的技术.这方面的主题在网上已经讨论了不少,我也经常会在一些个人项目上使用RequireJS和Dojo加载js 它们很强大,但有时候也会得不偿失.如果你使 ...
- 动态加载JS脚本到HTML
如果用原生态的js 有2中方法 1.直接document.write <script language="javascript"> document.wr ...
- 网站动态加载JS脚本
Demo_1 function loadJS(url, fn) { var ss = document.getElementsByName('script'), loaded = false; for ...
- 动态加载js和css
开发过程中经常需要动态加载js和css,今天特意总结了一下常用的方法. 1.动态加载js 方法一:动态加载js文件 // 动态加载js脚本文件 function loadScript(url) { v ...
- 动态加载 js
要实现动态加载JS脚本有4种方法: 1.直接document.write <script language="javascript"> document.write(& ...
- 动态加载js,css(项目中需要的)
最近做的一个项目需要加入百度统计,大家都知道百度统计在页面引用就是一坨js,实现方法很简单引用到页面就ok了. 那么问题来了,虽然我不知道百度统计的原理是啥,我的测试服引用了百度统计,百度统计账号里面 ...
- JS动态加载JS
1.直接document.write <script language="javascript"> document.write("<scrip ...
随机推荐
- oracle,mysql,SqlServer三种数据库的分页查询的实例。
MySql: MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它有一个或两个参数,如 ...
- python实用小技巧自问自答系列(一):查看类中函数文档doc的方法
问题:如何查看某个类的方法文档说明或者是函数的参数列表情况? 答: 方法一:直接在需要查询的方法后面加上".__doc__"即可以打印出该方法的文档说明(需要先导入该方法所属模块) ...
- php : Warning: strftime(): It is not safe to rely on the system's timezone settings.
使用 Smarty 的时候出现这种警告: Warning: strftime(): It is not safe to rely on the system's timezone settings. ...
- Thread.join()方法
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B.t.join() ...
- HDFS 核心原理
HDFS 核心原理 2016-01-11 杜亦舒 HDFS(Hadoop Distribute File System)是一个分布式文件系统文件系统是操作系统提供的磁盘空间管理服务,只需要我们指定把文 ...
- 【LeetCode】Hamming Distance
问题网址 https://leetcode.com/problems/hamming-distance/ 就是一个异或后,求1的位数的问题. 看到问题之后,首先困扰是: int能不能求异或?是不是要转 ...
- 为大型网站提速—redis
一.数据库 1.关系型数据库:Mysql,sqlserver,oracle 2.非关系型数据库(nosql):key-value存储数据库(redis) 列表存储数据库 文档型数据库(MongoDb) ...
- MySQL数据库常用命令
1.连接mysql数据库:mysql -u用户名 -p密码; 2.创建数据库:create database 数据库名称; 3.删除数据库:drop database 数据库名称; 4.使用数据库:u ...
- jQuery Mobile学习日记之HelloWorld
这里是本人学习jQuery Mobile的过程,主要用于记录,过程中有不对的地方或不严谨的地方,欢予以指出纠正,非常感谢! 1.首先是下载安装以下文件: [Opera Mobile Emulator] ...
- SPSS数据分析—最优尺度回归
在之前介绍的线性回归模型中,有一个隐含的假设是自变量均为连续变量,但实际上自变量有时候是分类变量,类似于方差分析中的因素,这种分类自变量在回归分析中,也默认作为连续变量使用,这就会产生一个问题,如果是 ...