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 相关文章推荐
javascript五图轮播切换实用版
Aug 17 Javascript
javascript利用控件对windows的操作实现原理与应用
Dec 23 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
Feb 05 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
Oct 18 Javascript
jquery退出each循环的写法
Feb 26 Javascript
Node.js开发之访问Redis数据库教程
Jan 14 Javascript
JSON相关知识汇总
Jul 03 Javascript
jquery实现的蓝色二级导航条效果代码
Aug 24 Javascript
Bootstrap导航条的使用和理解3
Dec 14 Javascript
JS逻辑运算符短路操作实例分析
Jul 09 Javascript
Vue之mixin全局的用法详解
Aug 22 Javascript
layui实现数据分页功能
Jul 27 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
使用PHP实现Mysql读写分离
2013/06/28 PHP
nodejs读取memcache示例分享
2014/01/02 NodeJs
在JS中如何调用JSP中的变量
2014/01/22 Javascript
flash遮住div问题的正确解决方法
2014/02/27 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
javascript实现数组内值索引随机化及创建随机数组的方法
2015/08/10 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
2016/02/03 Javascript
jquery 动态合并单元格的实现方法
2016/08/26 Javascript
JS中Array数组学习总结
2017/01/18 Javascript
H5图片压缩与上传实例
2017/04/21 Javascript
node.js平台下利用cookie实现记住密码登陆(Express+Ejs+Mysql)
2017/04/26 Javascript
关于vue中 $emit的用法详解
2018/04/12 Javascript
JavaScript事件委托原理与用法实例分析
2018/06/07 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
2019/10/10 jQuery
Sublime Text3 配置 NodeJs 环境的方法
2020/05/20 NodeJs
JavaScript实现烟花绽放动画效果
2020/08/04 Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
2020/09/22 Javascript
Python Web框架Tornado运行和部署
2020/10/19 Python
python中PIL安装简单教程
2016/04/21 Python
python解决网站的反爬虫策略总结
2016/10/26 Python
python 二分查找和快速排序实例详解
2017/10/13 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
基于HTML5+Webkit实现树叶飘落动画
2017/12/28 HTML / CSS
日本面向世界,国际级的免税在线购物商城:DOKODEMO
2017/02/01 全球购物
如何唤起类中的一个方法
2013/11/29 面试题
员工培训邀请函
2014/02/02 职场文书
爱护公共设施演讲稿
2014/09/13 职场文书
工作所在部门证明
2014/09/21 职场文书
学生不讲诚信检讨书
2014/09/29 职场文书
工伤事故证明
2014/10/20 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
《飘》英文读后感五篇
2019/10/11 职场文书
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android
vue项目支付功能代码详解
2022/02/18 Vue.js