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 相关文章推荐
flash javascript之间的通讯方法小结
Dec 20 Javascript
jQuery function的正确书写方法
Aug 02 Javascript
基于mouseout和mouseover等类似事件的冒泡问题解决方法
Nov 18 Javascript
JavaScript实现的一个倒计时的类
Mar 12 Javascript
jQuery获得包含margin的outerWidth和outerHeight的方法
Mar 25 Javascript
js操作css属性实现div层展开关闭效果的方法
May 11 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
May 28 Javascript
Bootstrap每天必学之前端开发框架
Nov 19 Javascript
基于iscroll.js实现下拉刷新和上拉加载效果
Nov 28 Javascript
浅谈Vue数据绑定的原理
Jan 08 Javascript
vue.js根据代码运行环境选择baseurl的方法
Feb 28 Javascript
在vue中使用Echarts画曲线图的示例
Oct 03 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写出自己的BLOG系统 2
2010/04/12 PHP
修改PHP的memory_limit限制的方法分享
2012/02/21 PHP
学习php设计模式 php实现抽象工厂模式
2015/12/07 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
Linux下使用jq友好的打印JSON技巧分享
2014/11/18 Javascript
详谈jQuery.load()和Jsp的include的区别
2017/04/12 jQuery
基于vue-cli配置lib-flexible + rem实现移动端自适应
2017/12/26 Javascript
JS中call()和apply()的功能及用法实例分析
2019/06/28 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
[05:31]DOTA2英雄梦之声_第08期_莉娜
2014/06/23 DOTA
python通过ftplib登录到ftp服务器的方法
2015/05/08 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
Python利用matplotlib绘制折线图的新手教程
2020/11/05 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
2021/02/22 Python
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
心理健康教育心得体会
2013/12/29 职场文书
期末自我鉴定
2014/01/23 职场文书
食品安全承诺书
2014/05/22 职场文书
自强自立美德少年事迹材料
2014/08/16 职场文书
低碳环保演讲稿
2014/08/28 职场文书
医院党员公开承诺书
2014/08/30 职场文书
具结保证书
2015/01/17 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
销售经理岗位职责范本
2015/04/02 职场文书
政协常委会议主持词
2015/07/03 职场文书
k8s部署redis cluster集群的实现
2021/06/24 Redis