动态载入/删除/更新外部 JavaScript/Css 文件的代码


Posted in Javascript onJuly 03, 2010

动态载入 JavaScript/Csss 文件
传统加载外部JavaScript(*.js) 或者 Css(*.css)文件的方法是直接在<head>标签里面进行添加:

<head> 
<script type="text/javascript" src="myscript.js"></script> 
<link rel="stylesheet" type="text/css" href="main.css" /> 
</head>

这些文件用这种方式会同步加载到当前这个页面。

现在用动态的方式载入JavaScript/Css文件:

用 DOM createElement 方法创建一个 “script” 或者 ”link” 元素
设置相应的属性
使用 appendChild 方法, 把创建的元素插入到 head 标签的末尾

function loadjscssfile(filename, filetype){ 
//如果文件类型为 .js ,则创建 script 标签,并设置相应属性 
if (filetype=="js"){ 
var fileref=document.createElement('script'); 
fileref.setAttribute("type","text/javascript"); 
fileref.setAttribute("src", filename); 
} 
//如果文件类型为 .css ,则创建 script 标签,并设置相应属性 
else if (filetype=="css"){ 
var fileref=document.createElement("link"); 
fileref.setAttribute("rel", "stylesheet"); 
fileref.setAttribute("type", "text/css"); 
fileref.setAttribute("href", filename); 
} 
if (typeof fileref!="undefined") 
document.getElementsByTagName("head")[0].appendChild(fileref); 
} 
//动态添加一个.js 文件 
loadjscssfile("myscript.js", "js"); 
//像添加.js文件一样,动态添加一个.php文件 
loadjscssfile("javascript.php", "js"); 
//动态一个.css文件 
loadjscssfile("mystyle.css", "css");

为了防止多次载入同一个js/css文件, 添加以下判断(这只是粗略检测)
//临时载入的文件名 
var filesadded=""; function checkloadjscssfile(filename, filetype){ 
if (filesadded.indexOf("["+filename+"]")==-1){ 
loadjscssfile(filename, filetype); 
//把 [filename] 存入 filesadded 
filesadded+="["+filename+"]"; 
} 
else{ 
alert("file already added!"); 
} 
//第一次载入 
checkloadjscssfile("myscript.js", "js"); 
//重复载入同一个文件, 失败 
checkloadjscssfile("myscript.js", "js");

动态删除 JavaScript/Csss 文件
注意:ie6/7 下动态删除样式时有bug. 2种解决方案:1.样式表里不要有import的样式表 2.把link的type属性设置为空值, 然后再修改 href 的地, 或者直接设置href为空, 最后再把type值设置成”text/css” 强制让ie解释新的样式表。

取得相应的 DOM 元素
根据 文件名&文件类型 定位元素
用 DOM removeChild 删除一个 “script” 或者 ”link” 元素

function removejscssfile(filename, filetype){ 
//判断文件类型 
var targetelement=(filetype=="js")? "script" : (filetype=="css")? "link" : "none"; 
//判断文件名 
var targetattr=(filetype=="js")? "src" : (filetype=="css")? "href" : "none"; 
var allsuspects=document.getElementsByTagName(targetelement); 
//遍历元素, 并删除匹配的元素 
for (var i=allsuspects.length; i>=0; i--){ 
if (allsuspects[i] && allsuspects[i].getAttribute(targetattr)!=null && allsuspects[i].getAttribute(targetattr).indexOf(filename)!=-1) 
allsuspects[i].parentNode.removeChild(allsuspects[i]); 
} 
} removejscssfile("somescript.js", "js"); 
removejscssfile("somestyle.css", "css");

动态更新 JavaScript/Csss 文件
使用 createElement 创建 要更新的 JavaScript/Css 元素
查找要被替换的元素
用 replaceChild 替换元素
function createjscssfile(filename, filetype){ 
if (filetype=="js"){ //if filename is a external JavaScript file 
var fileref=document.createElement('script') 
fileref.setAttribute("type","text/javascript") 
fileref.setAttribute("src", filename) 
} 
else if (filetype=="css"){ //if filename is an external CSS file 
var fileref=document.createElement("link") 
fileref.setAttribute("rel", "stylesheet") 
fileref.setAttribute("type", "text/css") 
fileref.setAttribute("href", filename) 
} 
return fileref 
} function replacejscssfile(oldfilename, newfilename, filetype){ 
var targetelement=(filetype=="js")? "script" : (filetype=="css")? "link" : "none"; 
var targetattr=(filetype=="js")? "src" : (filetype=="css")? "href" : "none"; 
var allsuspects=document.getElementsByTagName(targetelement); 
for (var i=allsuspects.length; i>=0; i--){ 
if (allsuspects[i] && allsuspects[i].getAttribute(targetattr)!=null && allsuspects[i].getAttribute(targetattr).indexOf(oldfilename)!=-1){ 
var newelement=createjscssfile(newfilename, filetype); 
allsuspects[i].parentNode.replaceChild(newelement, allsuspects[i]); 
} 
} 
} 
//用 "newscript.js" 替换 "oldscript.js" 
replacejscssfile("oldscript.js", "newscript.js", "js"); 
//用 "newscript.css" 替换 "oldscript.css" 
replacejscssfile("oldstyle.css", "newscript.css","css");
Javascript 相关文章推荐
js调用图片隐藏&amp;显示实现代码
Sep 13 Javascript
jquery 取子节点及当前节点属性值
Jul 25 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
Nov 03 Javascript
jQuery 全选 全部选 反选 实现代码
Aug 17 Javascript
ionic实现可滑动的tab选项卡切换效果
Apr 15 Javascript
Node.js实现文件上传的示例
Jun 28 Javascript
JavaScript中数组常见操作技巧
Sep 01 Javascript
详解.vue文件中style标签的几个标识符
Jul 17 Javascript
React中使用UEditor百度富文本的方法
Aug 22 Javascript
微信小程序template模板与component组件的区别和使用详解
May 22 Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
Dec 17 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
Sep 16 Javascript
一个原生的用户等级的进度条
Jul 03 #Javascript
清空上传控件input file的值
Jul 03 #Javascript
javascript深入理解js闭包
Jul 03 #Javascript
JSON JQUERY模板实现说明
Jul 03 #Javascript
jquery.boxy插件的iframe扩展代码
Jul 02 #Javascript
JQuery AJAX提交中文乱码的解决方案
Jul 02 #Javascript
IE本地存储userdata的一个bug说明
Jul 01 #Javascript
You might like
php桌面中心(一) 创建数据库
2007/03/11 PHP
用PHP伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
php设计模式之命令模式的应用详解
2013/05/21 PHP
php微信公众开发之获取周边酒店信息的方法
2014/12/22 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
调试php程序的简单步骤
2019/10/04 PHP
javascript 短路法代码精简
2009/08/20 Javascript
解析Jquery中如何把一段html代码动态写入到DIV中(实例说明)
2013/07/09 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
jQuery zTree加载树形菜单功能
2016/02/25 Javascript
Angularjs material 实现搜索框功能
2016/03/08 Javascript
关于session和cookie的简单理解
2016/06/08 Javascript
Jquery Easyui搜索框组件SearchBox使用详解(19)
2016/12/17 Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
2018/08/14 Javascript
jquery实现选项卡切换代码实例
2019/05/14 jQuery
vue-cli3跨域配置的简单方法
2019/09/06 Javascript
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
[01:08:09]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第二局
2016/03/02 DOTA
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
处理python中多线程与多进程中的数据共享问题
2019/07/28 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
Django单元测试中Fixtures的使用方法
2020/02/26 Python
终于搞懂了Keras中multiloss的对应关系介绍
2020/06/22 Python
美国高端寝具品牌:Coyuchi
2017/02/08 全球购物
Weblogic的布署方式
2013/08/23 面试题
初三物理教学反思
2014/01/21 职场文书
母亲节感恩寄语
2014/02/21 职场文书
房屋买卖协议书范本
2014/04/10 职场文书
党建工作经验交流材料
2014/05/25 职场文书
支部鉴定材料
2014/06/02 职场文书
鼋头渚导游词
2015/02/05 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
python批量更改目录名/文件名的方法
2021/04/18 Python
Python移位密码、仿射变换解密实例代码
2021/06/27 Python
JavaScript前端面试组合函数
2022/06/21 Javascript