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 相关文章推荐
用dtree实现树形菜单 dtree使用说明
Oct 17 Javascript
JavaScript中遍历对象的property的3种方法介绍
Dec 30 Javascript
jQuery实现网页顶部固定导航效果代码
Dec 24 Javascript
JS读写CSS样式的方法汇总
Aug 16 Javascript
javascript创建对象的3种方法
Nov 02 Javascript
解决使用vue.js路由后失效的问题
Mar 17 Javascript
用Object.prototype.toString.call(obj)检测对象类型原因分析
Oct 11 Javascript
Vue.js样式动态绑定实现小结
Jan 24 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
Jan 27 jQuery
用vue写一个日历
Nov 02 Javascript
vue中axios封装使用的完整教程
Mar 03 Vue.js
JavaScript的Set数据结构详解
Feb 18 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
php array_filter除去数组中的空字符元素
2020/06/21 PHP
PHP中的函数-- foreach()的用法详解
2013/06/24 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
2014/04/10 PHP
CI映射(加载)数据到view层的方法
2016/03/28 PHP
ecshop添加菜单及权限分配问题
2017/11/21 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
JavaScript语言中的Literal Syntax特性分析
2007/03/08 Javascript
学习YUI.Ext第五日--做拖放Darg&amp;Drop
2007/03/10 Javascript
DOM 基本方法
2009/07/18 Javascript
jQuery Validate验证框架经典大全
2015/09/23 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
js学使用setTimeout实现轮循动画
2017/07/17 Javascript
NestJs 静态目录配置详解
2019/03/12 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
js new Date()实例测试
2019/10/31 Javascript
zbar解码二维码和条形码示例
2014/02/07 Python
Python标准库与第三方库详解
2014/07/22 Python
基于hashlib模块--加密(详解)
2017/06/21 Python
Python 元类实例解析
2018/04/04 Python
TensorFlow数据输入的方法示例
2018/06/19 Python
python 借助numpy保存数据为csv格式的实现方法
2018/07/04 Python
python画图系列之个性化显示x轴区段文字的实例
2018/12/13 Python
对python修改xml文件的节点值方法详解
2018/12/24 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
keras实现VGG16 CIFAR10数据集方式
2020/07/07 Python
python 读取、写入txt文件的示例
2020/09/27 Python
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
英国首屈一指的票务公司:See Tickets
2019/05/11 全球购物
公司业务主管岗位职责
2013/12/07 职场文书
求职信怎么写范文
2014/05/26 职场文书
升职自荐书
2019/05/09 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android
解决flex布局中子项目尺寸不受flex-shrink限制
2022/05/11 HTML / CSS