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中sort()方法的用法
Nov 04 Javascript
不一样的文字闪烁 轮番闪烁
Nov 11 Javascript
JS动态调用方法名示例介绍
Dec 18 Javascript
引入JS文件IE6报语法错误或缺少对象问题的解决方法
Jan 09 Javascript
浅谈js内置对象Math的属性和方法(推荐)
Sep 19 Javascript
jquery获取下拉框中的循环值
Feb 08 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
Aug 12 Javascript
js实现导航跟随效果
Nov 17 Javascript
vue.draggable实现表格拖拽排序效果
Dec 01 Javascript
Jquery让form表单异步提交代码实现
Nov 14 jQuery
JavaScript复制变量三种方法实例详解
Jan 09 Javascript
面试中canvas绘制图片模糊图片问题处理
Mar 13 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
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
php设计模式 Builder(建造者模式)
2011/06/26 PHP
解析yii数据库的增删查改
2013/06/20 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
基于jquery实现等比缩放图片
2014/12/03 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
总结JavaScript中布尔操作符||与&amp;&amp;的使用技巧
2015/11/17 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
2016/07/14 Javascript
js实现仿购物车加减效果
2017/03/01 Javascript
使用travis-ci如何持续部署node.js应用详解
2017/07/30 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
Vue根据条件添加click事件的方式
2019/11/09 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
vue中提示$index is not defined错误的解决方式
2020/09/02 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
vue中路由跳转不计入history的操作
2020/09/21 Javascript
Python调用C/C++动态链接库的方法详解
2014/07/22 Python
python实现简单中文词频统计示例
2017/11/08 Python
Python实现去除列表中重复元素的方法小结【4种方法】
2018/04/27 Python
Pycharm设置去除显示的波浪线方法
2018/10/28 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
python 实现矩阵填充0的例子
2019/11/29 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
Python数据相关系数矩阵和热力图轻松实现教程
2020/06/16 Python
中学老师的自我评价
2013/11/07 职场文书
教育学习自我评价
2014/02/03 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
关于感恩的演讲稿800字
2014/08/26 职场文书
2014年基建工作总结
2014/12/12 职场文书
人事文员岗位职责
2015/02/04 职场文书
Python面试不修改数组找出重复的数字
2022/05/20 Python
nginx 配置指令之location使用详解
2022/05/25 Servers
Hive导入csv文件示例
2022/06/25 数据库
python解析照片拍摄时间进行图片整理
2022/07/23 Python