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 相关文章推荐
InnerHtml和InnerText的区别分析
Mar 13 Javascript
jValidate 基于jQuery的表单验证插件
Dec 12 Javascript
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
Jan 12 Javascript
JavaScript中的原型prototype属性使用详解
Jun 05 Javascript
巧用canvas
Jan 21 Javascript
JavaScript之事件委托实例(附原生js和jQuery代码)
Jul 22 jQuery
VUE中的无限循环代码解析
Sep 22 Javascript
微信小程序实现验证码获取倒计时效果
Feb 08 Javascript
在微信小程序中渲染HTML内容的方法示例
Sep 28 Javascript
apicloud拉起小程序并传递参数的方法示例
Nov 21 Javascript
详解vue更改头像功能实现
Apr 28 Javascript
JavaScript实现优先级队列
Dec 06 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
标准版Eclipse搭建PHP环境的详细步骤
2015/11/18 PHP
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
JavaScript function 的 length 属性使用介绍
2014/09/15 Javascript
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
jQuery中设置form表单中action值的实现方法
2016/05/25 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
什么是JavaScript注入攻击?
2016/09/14 Javascript
Bootstrap幻灯片轮播图支持触屏左右手势滑动的实现方法
2016/10/13 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
jquery easyui DataGrid简单示例
2017/01/23 Javascript
JavaScript数据结构之优先队列与循环队列实例详解
2017/10/27 Javascript
Layer+Echarts构建弹出层折线图的方法
2019/09/25 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
JavaScript代码简化技巧实例解析
2020/09/09 Javascript
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
Python引用类型和值类型的区别与使用解析
2017/10/17 Python
Python3.6安装及引入Requests库的实现方法
2018/01/24 Python
python实现图书馆研习室自动预约功能
2018/04/27 Python
python 将对象设置为可迭代的两种实现方法
2019/01/21 Python
10分钟用python搭建一个超好用的CMDB系统
2019/07/17 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
Python hashlib常见摘要算法详解
2020/01/13 Python
Python gevent协程切换实现详解
2020/09/14 Python
CSS3实现div从下往上滑入滑出效果示例
2020/04/28 HTML / CSS
微软加拿大官方网站:Microsoft Canada
2019/04/28 全球购物
北京某科技有限公司C# .net笔试题
2014/09/27 面试题
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
小学生差生评语
2014/12/29 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
学困生转化工作总结
2015/08/13 职场文书
七年级作文之冬景
2019/11/07 职场文书
微信小程序实现轮播图指示器
2022/06/25 Javascript