JavaScript插入动态样式实现代码


Posted in Javascript onFebruary 22, 2012

与动态脚本类似,所谓动态样式是指在页面刚加载时不存在的样式;动态样式是在页面加载完成后动态添加到页面中。

我们以下面这个典型的<link>元素为例:

<link rel="stylesheet" type="text/css" href="style.css">使用DOM代码可以很容易的动态创建出这个元素:

var link = document.createElement("link"); 
link.rel = "stylesheet"; 
link.type = "text/css"; 
link.href = "style.css"; 
var head = document.getElementsByTagName("head")[0]; 
head.appendChild(link);

以上代码在所有主流浏览器中都可以正常运行。需要注意的是,必须将<link>元素添加到<head>而不是<body>元素,才能保证在所有浏览器中的行为一致。整个过程可以用一下函数来表示:
function loadStyles(url) { 
var link = document.createElement("link"); 
link.rel = "stylesheet"; 
link.type = "text/css"; 
link.href = url; 
var head = document.getElementsByTagName("head")[0]; 
head.appendChild(link); 
} 
loadStyles("style.css")

加载外部样式文件的过程是异步的,也就是加载样式与执行JavaScript代码的过程没有固定的次序。

另一种定义样式的方式是使用<style>元素来包含嵌入式CSS,如下所示:

<style>
body { background-color: red; }
</style>

按照相同的逻辑,下列DOM代码应该是有效的:

var style = document.createElement("style"); 
style.type = "text/css"; 
style.appendChild(document.createTextNode("body{background-color:red;}")); 
var head = document.getElementsByTagName("head")[0]; 
head.appendChild(style);

以上代码可以在Firefox、Safrai、Chrome和Opera中运行,在IE中则会报错。IE将<style>视为一个特殊的、与<script>类似的节点,不允许访问其子节点。事实上,IE此时抛出的错误与向<script>元素添加子节点时抛出的错误相同。解决IE中的这个问题的办法,就是访问元素的styleSheet属性,该属性又有一个cssText属性,可以接受CSS代码,如下面的例子所示:
var style = document.createElement("style"); 
style.type = "text/css"; 
try { 
style.appendChild(document.createTextNode("body{background-color:red}")); 
} catch (ex) { 
style.styleSheet.cssText = "body{background-color:red}"; 
} 
var head = document.getElementsByTagName("head")[0]; 
head.appendChild(style);

与动态添加嵌入式脚本类似,重写后的代码使用了try-catch语句来捕获IE抛出的错误,然后再使用针对IE的特殊方式来设置样式。一次通用的解决方案如下:
function loadStyleString(css) { 
var style = document.createElement("style"); 
style.type = "text/css"; 
try { 
style.appendChild(document.createTextNode(css)); 
} catch (ex) { 
style.styleSheet.cssText = css; 
} 
var head = document.getElementsByTagName("head")[0]; 
head.appendChild(style); 
} 
loadStyleString("body{background-color:red}");
Javascript 相关文章推荐
关于使用 jBox 对话框的提交不能弹出问题解决方法
Nov 07 Javascript
javascript 构造函数方式定义对象
Jan 02 Javascript
学习使用AngularJS文件上传控件
Feb 16 Javascript
利用Javascript仿Excel的数据透视分析功能
Sep 07 Javascript
JS 调用微信扫一扫功能
Dec 22 Javascript
javascript实现简单的ajax封装示例
Dec 28 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
Mar 02 Javascript
原生JS实现$.param() 函数的方法
Aug 10 Javascript
使用JavaScript破解web
Sep 28 Javascript
vue cli 3.x 项目部署到 github pages的方法
Apr 17 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
Dec 12 Javascript
JS removeAttribute()方法实现删除元素的某个属性
Jan 11 Javascript
javascript插入样式实现代码
Feb 22 #Javascript
Javascript 中的 call 和 apply使用介绍
Feb 22 #Javascript
JS对象与JSON格式数据相互转换
Feb 20 #Javascript
js 代码优化点滴记录
Feb 19 #Javascript
JQuery.closest(),parent(),parents()寻找父结点
Feb 17 #Javascript
JavaScript操作XML 使用百度RSS作为新闻源示例
Feb 17 #Javascript
jquery实现奇偶行赋值不同css值
Feb 17 #Javascript
You might like
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
2019/01/16 PHP
加速IE的Javascript document输出的方法
2010/12/02 Javascript
jquery(live)中File input的change方法只起一次作用的解决办法
2011/10/21 Javascript
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
jquery输入数字随机抽奖特效的简单实现代码
2016/06/10 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
layui中的switch开关实现方法
2019/09/03 Javascript
layer.open回调获取弹出层参数的实现方法
2019/09/10 Javascript
layui按条件隐藏表格列的实例
2019/09/19 Javascript
vue Treeselect下拉树只能选择第N级元素实现代码
2020/08/31 Javascript
.netcore+vue 实现压缩文件下载功能
2020/09/24 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
[03:30]完美盛典趣味短片 CSGO2019年度名场面
2019/12/07 DOTA
解析Python中的异常处理
2015/04/28 Python
图文详解WinPE下安装Python
2016/05/17 Python
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
2017/09/30 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
Python中str.join()简单用法示例
2018/03/20 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
Python基于DB-API操作MySQL数据库过程解析
2020/04/23 Python
pandas创建DataFrame的7种方法小结
2020/06/14 Python
代码中finally中的代码会不会执行
2012/02/06 面试题
运动会通讯稿400字
2014/01/28 职场文书
《傅雷家书》教学反思
2014/04/20 职场文书
中学生国旗下讲话稿
2014/04/26 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
教师批评与自我批评材料
2014/10/16 职场文书
2014年小学校长工作总结
2014/12/08 职场文书
音乐教师个人总结
2015/02/06 职场文书
我是特种兵观后感
2015/06/11 职场文书
初三语文教学反思
2016/03/03 职场文书