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 23 Javascript
jquery插件开发之实现md5插件
Mar 17 Javascript
深入理解javascript的执行顺序
Apr 04 Javascript
jQuery插件实现文件上传功能(支持拖拽)
Aug 27 Javascript
javascript中href和replace的比较(详解)
Nov 25 Javascript
js实现截图保存图片功能的代码示例
Feb 16 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
Aug 26 Javascript
总结4个方面优化Vue项目
Feb 11 Javascript
解决小程序无法触发SESSION问题
Feb 03 Javascript
JS实现小米轮播图
Sep 21 Javascript
javascript遍历对象的五种方式实例代码
Oct 24 Javascript
Vue自定义铃声提示音组件的实现
Jan 22 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文件服务实现虚拟挂载其他目录示例
2014/04/17 PHP
微信支付开发交易通知实例
2016/07/12 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
2016/10/08 PHP
laravel框架中间件 except 和 only 的用法示例
2019/07/12 PHP
JS 容错处理代码, 屏蔽错误信息
2021/03/09 Javascript
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
jQuery实现高亮显示的方法
2015/03/10 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
2015/09/19 Javascript
js基本算法:冒泡排序,二分查找的简单实例
2016/10/08 Javascript
深入理解React高阶组件
2017/09/28 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
Python实现图片滑动式验证识别方法
2017/11/09 Python
Python实现判断字符串中包含某个字符的判断函数示例
2018/01/08 Python
python判断一个集合是否为另一个集合的子集方法
2018/05/04 Python
Pandas 按索引合并数据集的方法
2018/11/15 Python
在Django中URL正则表达式匹配的方法
2018/12/20 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
kali中python版本的切换方法
2019/07/11 Python
Python搭建代理IP池实现存储IP的方法
2019/10/27 Python
Python 生成短8位唯一id实战教程
2021/01/13 Python
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
伦敦眼门票在线预订:London Eye
2018/05/31 全球购物
工商学院毕业生个人自我评价
2013/09/19 职场文书
高中自我鉴定
2013/12/20 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
党的生日演讲稿
2014/09/10 职场文书
查摆剖析材料范文
2014/09/30 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
出生证明范本
2015/06/15 职场文书
《风不能把阳光打败》读后感3篇
2020/01/06 职场文书
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
Java 超详细讲解数据结构中的堆的应用
2022/04/02 Java/Android
python中mongodb包操作数据库
2022/04/19 Python