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 相关文章推荐
一个可以显示阴历的JS代码
Mar 05 Javascript
ExtJS下 Ext.Direct加载和提交过程排错小结
Apr 02 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
May 28 Javascript
一个检测表单数据的JavaScript实例
Oct 31 Javascript
Javascript显示和隐藏ul列表的方法
Jul 15 Javascript
纯JS代码实现一键分享功能
Apr 20 Javascript
ReactNative踩坑之配置调试端口的解决方法
Jul 28 Javascript
利用百度地图API获取当前位置信息的实例
Nov 06 Javascript
详解小程序之简单登录注册表单验证
May 13 Javascript
详解vue 2.6 中 slot 的新用法
Jul 09 Javascript
小程序websocket心跳库(websocket-heartbeat-miniprogram)
Feb 23 Javascript
vue基于better-scroll仿京东分类列表
Jun 30 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安全性漫谈
2012/06/28 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
ThinkPHP中create()方法自动验证表单信息
2017/04/28 PHP
php实现的mongoDB单例模式操作类
2018/01/20 PHP
有趣的JavaScript数组长度问题代码说明
2011/01/20 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
2015/12/03 Javascript
js命名空间写法示例
2015/12/18 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
解决JQuery全选/反选第二次失效的问题
2017/10/11 jQuery
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
security.js实现的RSA加密功能示例
2018/06/06 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
vue 在methods中调用mounted的实现操作
2020/08/07 Javascript
js实现纯前端压缩图片
2020/11/16 Javascript
Python functools模块学习总结
2015/05/09 Python
python socket多线程通讯实例分析(聊天室)
2016/04/06 Python
TensorFlow安装及jupyter notebook配置方法
2017/09/08 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
django 实现电子支付功能的示例代码
2018/07/25 Python
django框架auth模块用法实例详解
2019/12/10 Python
keras 获取某层的输入/输出 tensor 尺寸操作
2020/06/10 Python
公认8个效率最高的爬虫框架
2020/07/28 Python
Lulu Guinness露露·吉尼斯官网:红唇包
2019/02/03 全球购物
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
大学辅导员事迹材料
2014/02/05 职场文书
机修工工作职责
2014/02/21 职场文书
教师节宣传方案
2014/05/23 职场文书
元旦标语大全
2014/10/09 职场文书
证婚人致辞精选
2015/07/28 职场文书
《学会看病》教学反思
2016/02/17 职场文书
python 算法题——快乐数的多种解法
2021/05/27 Python
聊聊Python中关于a=[[]]*3的反思
2021/06/02 Python
零基础学java之循环语句的使用
2022/04/10 Java/Android