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 相关文章推荐
JAVASCRIPT  THIS详解 面向对象
Mar 25 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
Feb 16 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
Sep 05 Javascript
二叉树先序遍历的非递归算法具体实现
Jan 09 Javascript
浅谈JavaScript中setInterval和setTimeout的使用问题
Aug 01 Javascript
正则表达式(语法篇推荐)
Jun 24 Javascript
javascript 作用于作用域链的详解
Sep 27 Javascript
微信小程序实现topBar底部选择栏效果
Jul 20 Javascript
你或许不知道的一些npm实用技巧
Jul 04 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
Sep 09 Javascript
node静态服务器实现静态读取文件或文件夹
Dec 03 Javascript
React中使用Vditor自定义图片详解
Dec 25 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
跟我学小偷程序之成功偷取首页(第三天)
2006/10/09 PHP
php的一些小问题
2010/07/03 PHP
php visitFile()遍历指定文件夹函数
2010/08/21 PHP
php将金额数字转化为中文大写
2015/07/09 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
dojo 之基础篇(二)之从服务器读取数据
2007/03/24 Javascript
JavaScript里四舍五入函数round用法实例
2015/04/06 Javascript
jQuery实现鼠标划过修改样式的方法
2015/04/14 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
Vue的watch和computed方法的使用及区别介绍
2018/09/06 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
2019/07/13 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
2020/09/09 Javascript
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
Python库urllib与urllib2主要区别分析
2014/07/13 Python
python实现查询苹果手机维修进度
2015/03/16 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
Python二叉搜索树与双向链表转换算法示例
2019/03/02 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
python同时替换多个字符串方法示例
2019/09/17 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
Html5实现文件异步上传功能
2017/05/19 HTML / CSS
巴西网上药房:onofre
2016/11/21 全球购物
微软台湾官方网站:Microsoft台湾
2018/08/15 全球购物
Sony C++笔试题
2013/03/10 面试题
巾帼文明岗申报材料
2014/05/01 职场文书
投标授权委托书范文
2014/08/02 职场文书
公安交警中队队长个人对照检查材料思想汇报
2014/10/05 职场文书
党员批评与自我批评思想汇报
2014/10/08 职场文书
优秀教师单行材料
2014/12/16 职场文书
简单的辞职信怎么写
2015/02/28 职场文书
承兑汇票延期证明
2015/06/23 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
导游词之广州陈家祠
2019/10/21 职场文书