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写的数字拼图小游戏代码[学习参考]
Oct 29 Javascript
jquery里的正则表达式说明
Aug 03 Javascript
基于jquery的防止大图片撑破页面的实现代码(立即缩放)
Oct 24 Javascript
DIV始终居中的js代码
Feb 17 Javascript
浅析javascript 定时器
Dec 23 Javascript
浅谈javascript中基本包装类型
Jun 03 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
Jun 05 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
Apr 13 jQuery
基于express中路由规则及获取请求参数的方法
Mar 12 Javascript
详解vue组件基础
May 04 Javascript
微信小程序自定义胶囊样式
Dec 27 Javascript
原生JavaScript实现进度条
Feb 19 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 jquery 实现新闻标签分类与无刷新分页
2009/12/18 PHP
用php+ajax新建流程(请假、进货、出货等)
2017/06/11 PHP
网页图片延时加载的js代码
2010/04/22 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
2015/09/21 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
2016/12/08 Javascript
js实现自定义路由
2017/02/04 Javascript
利用jQuery异步上传文件的插件用法详解
2017/07/19 jQuery
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
深入浅出webpack之externals的使用
2017/12/04 Javascript
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
Vue移动端右滑屏幕返回上一页附源码下载
2019/06/26 Javascript
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
浅谈关于vue中scss公用的解决方案
2019/12/02 Javascript
微信小程序返回上一页传参并刷新过程解析
2019/12/13 Javascript
Vue组件间的通信pubsub-js实现步骤解析
2020/03/11 Javascript
[01:18]一目了然!DOTA2DotA快捷操作对比第一弹
2014/07/01 DOTA
Python基础入门之seed()方法的使用
2015/05/15 Python
利用python程序帮大家清理windows垃圾
2017/01/15 Python
python开发简易版在线音乐播放器
2017/03/03 Python
详解python eval函数的妙用
2017/11/16 Python
Python视频爬虫实现下载头条视频功能示例
2018/05/07 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
简单了解django缓存方式及配置
2019/07/19 Python
如何利用Python开发一个简单的猜数字游戏
2019/09/22 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
基于Python pyecharts实现多种图例代码解析
2020/08/10 Python
奥地利手表、香水、化妆品和珠宝购物网站:Brasty.at
2021/01/17 全球购物
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
2015/07/16 面试题
店长职务说明书
2014/02/04 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
员工三分钟演讲稿
2014/08/19 职场文书
2016年教师节贺卡寄语
2015/12/04 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS