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 相关文章推荐
统一接口:为FireFox添加IE的方法和属性的js代码
Mar 25 Javascript
javascript Onunload与Onbeforeunload使用小结
Dec 31 Javascript
jquery 仿QQ校友的DIV模拟窗口效果源码
Mar 24 Javascript
JQuery datepicker 使用方法
May 20 Javascript
60个很实用的jQuery代码开发技巧收集
Dec 15 Javascript
jquery使用on绑定a标签无效 只能用live解决
Jun 02 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
Dec 15 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
Dec 23 Javascript
详解使用Node.js 将txt文件转为Excel文件
Jul 05 Javascript
使用 Node.js 实现图片的动态裁切及算法实例代码详解
Sep 29 Javascript
详解vue3.0 的 Composition API 的一种使用方法
Oct 26 Javascript
解析原生JS getComputedStyle
May 25 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
linux中cd命令使用详解
2015/01/08 PHP
Zend Framework+smarty用法实例详解
2016/03/19 PHP
PHP实现按之字形顺序打印二叉树的方法
2018/01/16 PHP
在 Laravel 6 中缓存数据库查询结果的方法
2019/12/11 PHP
用Javascript 和 CSS 实现脚注(Footnote)效果
2009/09/09 Javascript
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
JQuery for与each性能比较分析
2013/05/14 Javascript
Node.js中AES加密和其它语言不一致问题解决办法
2014/03/10 Javascript
angular2使用简单介绍
2016/03/01 Javascript
12个非常实用的JavaScript小技巧【推荐】
2016/05/18 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
2016/10/10 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
关于Stream和Buffer的相互转换详解
2017/07/26 Javascript
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
2018/09/15 Javascript
ES6中let、const的区别及变量的解构赋值操作方法实例分析
2019/10/15 Javascript
小程序实现列表展开收起效果
2020/07/29 Javascript
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
python dataframe 输出结果整行显示的方法
2018/06/14 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
Django如何将URL映射到视图
2019/07/29 Python
python 实现读取csv数据,分类求和 再写进 csv
2020/05/18 Python
python 制作python包,封装成可用模块教程
2020/07/13 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
职业技术学校毕业生推荐信
2013/12/03 职场文书
安全生产先进个人材料
2014/02/06 职场文书
银行求职信范文
2014/05/26 职场文书
2014年合同管理工作总结
2014/12/02 职场文书
如何写好活动总结
2019/06/21 职场文书
Pygame Time时间控制的具体使用详解
2021/11/17 Python
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android
VUE使用draggable实现组件拖拽
2022/04/06 Vue.js