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 相关文章推荐
Jquery 1.42 checkbox 全选和反选代码
Mar 27 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
Apr 07 Javascript
jquery遍历select元素(实例讲解)
Dec 31 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
Feb 24 Javascript
使用纯javascript实现经典扫雷游戏
Apr 23 Javascript
给angular加上动画效遇到的问题总结
Feb 17 Javascript
jQuery 获取跨域XML(RSS)数据的相关总结分析
May 18 Javascript
Web程序员必备的7个JavaScript函数
Jun 14 Javascript
socket.io学习教程之基本应用(二)
Apr 29 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
Apr 26 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
May 16 jQuery
Vue项目中添加锁屏功能实现思路
Jun 29 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 Session变量不能传送到下一页的解决方法
2009/11/27 PHP
linux下编译安装memcached服务
2014/08/03 PHP
给ECShop添加最新评论
2015/01/07 PHP
基于PHP实现栈数据结构和括号匹配算法示例
2017/08/10 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
禁止空格提交表单的js代码
2013/11/17 Javascript
javascript使用appendChild追加节点实例
2015/01/12 Javascript
angularJS 中$scope方法使用指南
2015/02/09 Javascript
javascript实现类似java中getClass()得到对象类名的方法
2015/07/27 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
BootStrap Typeahead自动补全插件实例代码
2016/08/10 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
原生js实现电商侧边导航效果
2017/01/19 Javascript
Vue.js结合bootstrap实现分页控件
2017/03/10 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
详解vue-cli@2.x项目迁移日志
2019/06/06 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
Vue移动端实现图片上传及超过1M压缩上传
2019/12/23 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
JS实现拖拽元素时与另一元素碰撞检测
2020/08/27 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
使用Turtle画正螺旋线的方法
2017/09/22 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
2019/12/19 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
工作会议欢迎词
2014/01/16 职场文书
校园广播稿精选
2014/10/01 职场文书
四风专项整治工作情况汇报
2014/10/28 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
长江三峡导游词
2015/01/31 职场文书
世界卫生日宣传活动总结
2015/02/09 职场文书
医务人员医德考评自我评价
2015/03/03 职场文书