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库还是自己写代码?
Jan 28 Javascript
在jquery中处理带有命名空间的XML数据
Jun 13 Javascript
Highcharts 非常实用的Javascript统计图demo示例
Jul 03 Javascript
jquery实现的树形目录实例
Jun 26 Javascript
jQuery实现列表内容的动态载入特效
Aug 08 Javascript
JS加载iFrame出现空白问题的解决办法
May 13 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
May 26 Javascript
实现一个简单的vue无限加载指令方法
Jan 10 Javascript
jQuery表单元素选择器代码实例
Feb 06 Javascript
vue 中 beforeRouteEnter 死循环的问题
Apr 23 Javascript
Vue axios 跨域请求无法带上cookie的解决
Sep 08 Javascript
vue中利用mqtt服务端实现即时通讯的步骤记录
Jul 01 Vue.js
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对字符串的递增运算分析
2010/08/08 PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
2014/11/19 PHP
PHP+Oracle本地开发环境搭建方法详解
2019/04/01 PHP
Referer原理与图片防盗链实现方法详解
2019/07/03 PHP
在laravel框架中实现封装公共方法全局调用
2019/10/14 PHP
JavaScript网页定位详解
2014/01/13 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
AngularJS使用指令增强标准表单元素功能
2016/07/01 Javascript
js滚轮事件兼容性问题需要注意哪些
2016/11/15 Javascript
js 动态生成html 触发事件传参字符转义的实例
2017/02/14 Javascript
解决ionic和angular上拉加载的问题
2017/08/03 Javascript
vue 组件中slot插口的具体用法
2018/04/03 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
详解npm 配置项registry修改为淘宝镜像
2018/09/07 Javascript
js实现从右往左匀速显示图片(无缝轮播)
2020/06/29 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
Python实现的多线程端口扫描工具分享
2015/01/21 Python
用Python给文本创立向量空间模型的教程
2015/04/23 Python
python和bash统计CPU利用率的方法
2015/07/10 Python
python 循环遍历字典元素的简单方法
2016/09/11 Python
微信跳一跳python辅助软件思路及图像识别源码解析
2018/01/04 Python
详解Python如何生成词云的方法
2018/06/01 Python
python实现可逆简单的加密算法
2019/03/22 Python
Django rstful登陆认证并检查session是否过期代码实例
2019/08/13 Python
如何爬取通过ajax加载数据的网站
2019/08/15 Python
pandas数据拼接的实现示例
2020/04/16 Python
英国最大最好的无人机商店:Drones Direct
2019/07/12 全球购物
双立人美国官方商店:ZWILLING集团餐具和炊具
2020/05/07 全球购物
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
中专生求职自荐信范文
2013/12/22 职场文书
总经理任命书范本
2014/06/05 职场文书
建党伟业的观后感
2015/06/01 职场文书
机器人总动员观后感
2015/06/09 职场文书
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python