JS动态插入脚本和插入引用外部链接脚本的方法


Posted in Javascript onMay 21, 2018

在日常开发中,经常遇到 js 动态插入脚本 。

什么是 js 动态插入脚本 ?

指的是在页面加载时不存在,但将来的某一时刻通过修改该 DOM 动态添加的脚本。和操作 HTML 元素一样。

js 动态插入脚本也有两种方式:插入 JavaScript 代码和插入外部文件。

一、直接插入 javascript 代码

<script type="text/javascript">
function sayHi() {
 alert("hi");
}
</script>

从逻辑上讲,下面的 DOM 代码是有效的:

var script = document.createElement("script");
script.type = "text/javascript";
script.appendChild(document.createTextNode("function sayHi() {alert('hi');}"));
document.body.appendChild(script);

在 Firefox、Safari、Chrome 和 Opera 中,这些 DOM 代码可以正常运行。但在 IE 中,则会导致错误。IE 将 <script> 视为一个特殊的元素,不允许 DOM 访问其子节点。不过,可以使用

<script> 元素的 text 属性来指定 JavaScript 代码,想下面的例子这样:

var script = document.creatElement("script");
script.type = "text/javascript";
script.text = "function sayHi() {alert('hi');}";
document.body.appendChild(script);

经过修改之后的代码可以在 IE、Firefox、Opera 和 Safari3.0 中运行。Safari3.0 之前的版本虽然不能正确的支持 text 属性,但却允许使用文本节点技术来指定代码。如果需要兼容早期版本的 Safari,可以使用下列代码:

var script = document.createElement("script");
script.type = "type/javascript";
var code = "function sayHi() {alert('hi');}";
try {
 script.appendChild(document.createTextNode(code));
} catch (ex) {
 script.text = code;
}
document.body.appendChild(script)

这里首先尝试标准的 DOM 文本节点方法,因为除了 IE(在 IE 中会导致抛出错误),所有的浏览器都支持之中方式。如果这行代码抛出了错误,那么说明是 IE,于是就必须使用 text 属性了,整个过程可以用以下函数来表示:

function loadScriptString(code) {
 var script = document.createElement("script");
 script.type = "text/javascript";
 try {
 script.appendChild(document.createTextNode(code));
 } catch (ex) {
 script.text = code;
 }
 document.body.appendChild(script);
}
loadScriptString("function sayHi() {alert('hi');}");;

二、插入引用外部文件

动态加载外的外部 JavaScript 文件能够立即运行,比如下面的 <script> 元素。

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

而创建这个节点的 DOM 代码如下所示:

var script = document.createElement("script");
script.type = "text/javascript";
script.src = "client.js";
document.body.appendChild(script);

显然这里的 DOM 如实的反映了相应的 HTML 代码。不过执行最后一行代码把 <script> 元素添加到页面之前,是不会下载外部文件的。也可以把这个元素添加到 <head> 元素中效果相同。

但是怎么知道这个脚本文件加载完成了呢,因为我们有些函数需要在脚本加载完成生效后才能开始执行。

经过对网络上资源的搜索,我发现在 IE 浏览器中可以使用 <script> 元素的 onreadystatechange 来监控加载状态的改变,并通过判断它的 readyState 是 loaded 或 complete 来判断脚本是否加载完成。而非 IE 浏览器可以使用 onload 来直接判断脚本是否加载完成。

所以一个简单的实现过程看上去是下面这样的:

IE 下:

var script = document.createElement("script");
var url = 'http:';
script.setAttribute("type","text/javascript");
script.onreadystatechange = function() {
 if(this.readyState == "loaded" || this.readyState == "complete"){
 alert("加载成功啦!");
 }
}
script.setAttribute("src", url);

Opera、FF、Chrome 等:

var script = document.createElement("script");
var url = 'http';
script.setAttribute("type","text/javascript");
script.onload = function() {
 alert("加载成功啦!");
}
script.setAttribute("src",url);

最后可以合并一个 js 动态插入脚本 的 function ;

function loadScript(url, callback) {
 callback = typeof callback === 'function' ? callback : function() {};
 var head = document.getElementsByTagName('head')[0];
 var script = document.createElement('script');
 script.type = 'text/javascript';
 script.src = url; 
 script.onreadystatechange = function() {
 if(this.readyState == "loaded" || this.readyState == "complete"){
  callback();
 }
 }
 script.onload = callback;
 head.appendChild(script);
}

总结

以上所述是小编给大家介绍的JS动态插入脚本和插入引用外部链接脚本的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
动态表格Table类的实现
Aug 26 Javascript
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
Nov 11 Javascript
AngularJS+Node.js实现在线聊天室
Aug 28 Javascript
Jquery和JS获取ul中li标签的实现方法
Jun 02 Javascript
javascript之IE版本检测超简单方法
Aug 20 Javascript
ES6中的数组扩展方法
Aug 26 Javascript
react-native-fs实现文件下载、文本存储的示例代码
Sep 22 Javascript
微信小程序实现聊天对话(文本、图片)功能
Jul 06 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
Sep 30 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
Sep 01 Javascript
vue实现表格合并功能
Dec 01 Vue.js
JS实现简单的九宫格抽奖
Jun 28 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
May 21 #jQuery
基于Vue的延迟加载插件vue-view-lazy
May 21 #Javascript
jQuery获取随机颜色的实例代码
May 21 #jQuery
JS实现常见的查找、排序、去重算法示例
May 21 #Javascript
vue组件jsx语法的具体使用
May 21 #Javascript
关于vue的语法规则检测报错问题的解决
May 21 #Javascript
JS实现520 表白简单代码
May 21 #Javascript
You might like
10个可以简化php开发过程的MySQL工具
2010/04/11 PHP
YII使用url组件美化管理的方法
2015/12/28 PHP
微信公众号实现会员卡领取功能
2017/06/08 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
PHP中md5()函数的用法讲解
2019/03/30 PHP
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
js滚动条回到顶部的代码
2011/12/06 Javascript
详细介绍jQuery.outerWidth() 函数具体用法
2015/07/20 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
JavaScript 字符串数字左补位,右补位,取固定长度,截位扩展函数代码
2017/03/25 Javascript
JavaScript使用ZeroClipboard操作剪切板
2017/05/10 Javascript
vue+canvas实现炫酷时钟效果的倒计时插件(已发布到npm的vue2插件,开箱即用)
2018/11/05 Javascript
[04:45]DOTA2-DPC中国联赛正赛 iG vs LBZS 赛后选手采访
2021/03/11 DOTA
用Python计算三角函数之acos()方法的使用
2015/05/15 Python
听歌识曲--用python实现一个音乐检索器的功能
2016/11/15 Python
Python中Scrapy爬虫图片处理详解
2017/11/29 Python
python负载均衡的简单实现方法
2018/02/04 Python
基于python实现学生管理系统
2018/10/17 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
Python中的延迟绑定原理详解
2019/10/11 Python
keras 权重保存和权重载入方式
2020/05/21 Python
奖学金自我鉴定范文
2013/10/03 职场文书
大学生应聘自荐信
2013/10/11 职场文书
学习十八大精神心得体会
2013/12/31 职场文书
行政副总岗位职责
2014/02/23 职场文书
品质主管岗位职责
2014/03/16 职场文书
奥利奥广告词
2014/03/20 职场文书
优秀学生干部个人事迹材料
2014/06/02 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
争先创优演讲稿
2014/09/15 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
承诺书的签字人,需不需要承担相应的责任?
2019/07/09 职场文书
bat批处理之字符串操作的实现
2022/03/16 Python
Kubernetes部署实例并配置Deployment、网络映射、副本集
2022/04/01 Servers