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 相关文章推荐
网站上面有这种切换效果
Jun 26 Javascript
javascript之卸载鼠标事件的代码
May 14 Javascript
两个DIV等高的JS的实现代码
Dec 23 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
Jun 21 Javascript
网页中CDATA标记的说明
Sep 12 Javascript
eclipse如何忽略js文件报错(附图)
Oct 30 Javascript
jQuery学习笔记之jQuery+CSS3的浏览器兼容性
Jan 19 Javascript
纯js代码制作的网页时钟特效【附实例】
Mar 30 Javascript
JavaScript中windows.open()、windows.close()方法详解
Jul 28 Javascript
Vue完整项目构建(进阶篇)
Feb 10 Javascript
vue动态路由配置及路由传参的方式
May 23 Javascript
vue 使用 canvas 实现手写电子签名
Mar 06 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语法(3)
2006/10/09 PHP
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
PHP简单实现合并2个数字键数组值的方法
2017/05/30 PHP
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
javascript数组操作方法小结和3个属性详细介绍
2014/07/05 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
2016/06/20 Javascript
bootstrap警告框使用方法解析
2017/01/13 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
vue-cli3添加模式配置多环境变量的方法
2019/06/05 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
Python实现抓取网页并且解析的实例
2014/09/20 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
python实现双色球随机选号
2020/01/01 Python
python实现猜单词游戏
2020/05/22 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
优秀生推荐信范文
2013/11/28 职场文书
秋季运动会通讯稿
2014/01/24 职场文书
小学生竞选班干部演讲稿
2014/04/24 职场文书
软件项目开发计划书
2014/05/01 职场文书
十周年庆典策划方案
2014/06/03 职场文书
学生党员一帮一活动总结
2014/07/08 职场文书
运动会广播稿50字-100字
2014/10/11 职场文书
2015年英语教师工作总结
2015/05/20 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
青涩记忆观后感
2015/06/18 职场文书
2016校本研修培训心得体会
2016/01/08 职场文书
2016保送生自荐信范文
2016/01/29 职场文书
初中物理教学反思
2016/02/19 职场文书
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server