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 相关文章推荐
动态改变div的z-index属性的简单实例
Aug 08 Javascript
javascript中style.left和offsetLeft的用法说明
Mar 07 Javascript
javaScript事件机制兼容【详细整理】
Jul 23 Javascript
JS瀑布流实现方法实例分析
Dec 19 Javascript
微信小程序 图片边框解决方法
Jan 16 Javascript
基于Vue实现支持按周切换的日历
Sep 24 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
Apr 20 Javascript
微信小程序如何获取用户收货地址
Nov 27 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
Jan 15 Javascript
Vue.js实现开发购物车功能的方法详解
Feb 22 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
Nov 12 Javascript
Vue3配置axios跨域实现过程解析
Nov 25 Vue.js
通过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的简单采集数据入库程序
2014/07/30 PHP
PHP实现指定字段的多维数组排序函数分享
2015/03/09 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
js优化针对IE6.0起作用(详细整理)
2012/12/25 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
2013/11/25 Javascript
简易的投票系统以及js刷票思路和方法
2015/04/07 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
2015/08/31 Javascript
jqTransform美化表单
2015/10/10 Javascript
AngularJs实现分页功能不带省略号的代码
2016/05/30 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
详解在React项目中安装并使用Less(用法总结)
2019/03/18 Javascript
JavaScript函数重载操作实例浅析
2020/05/02 Javascript
JavaScript经典案例之简易计算器
2020/08/24 Javascript
如何在Express4.x中愉快地使用async的方法
2020/11/18 Javascript
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
Python基于Tkinter实现的记事本实例
2015/06/17 Python
python计算一个序列的平均值的方法
2015/07/11 Python
深入理解python函数递归和生成器
2016/06/06 Python
python assert的用处示例详解
2019/04/01 Python
Python Pandas中根据列的值选取多行数据
2019/07/08 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
详解Django模版中加载静态文件配置方法
2019/07/21 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
Python使用进程Process模块管理资源
2020/03/05 Python
Pycharm IDE的安装和使用教程详解
2020/04/30 Python
python 引用传递和值传递详解(实参,形参)
2020/06/05 Python
鱼油专家:Omegavia
2016/10/10 全球购物
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
励志演讲稿200字
2014/08/21 职场文书
实习指导教师评语
2014/12/30 职场文书
《社戏》教学反思
2016/02/22 职场文书
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python