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 相关文章推荐
jquery插件之easing 动态菜单
Aug 21 Javascript
JS俄罗斯方块,包含完整的设计理念
Dec 11 Javascript
jQuery$命名冲突怎么办如何解决
Jan 16 Javascript
Javascript基础教程之数据类型 (字符串 String)
Jan 18 Javascript
jQuery检查元素存在性(推荐)
Sep 17 Javascript
JavaScript中的 attribute 和 jQuery中的 attr 方法浅析
Jan 04 Javascript
node.js+jQuery实现用户登录注册AJAX交互
Apr 28 jQuery
vue 指令之气泡提示效果的实现代码
Oct 18 Javascript
JavaScript事件对象深入详解
Dec 30 Javascript
mpvue全局引入sass文件的方法步骤
Mar 06 Javascript
node中实现删除目录的几种方法
Jun 24 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
Nov 12 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 array_walk() 数组函数
2011/07/12 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
关于php内存不够用的快速解决方法
2013/10/26 PHP
PHP实现的sqlite数据库连接类
2014/12/12 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
2007/01/22 Javascript
有效的捕获JavaScript焦点的方法小结
2009/10/08 Javascript
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
iframe窗口高度自适应的实现方法
2014/01/08 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
2016/01/18 Javascript
dedecms页面如何获取会员状态的实例代码
2016/03/15 Javascript
javascript ES6中箭头函数注意细节小结
2017/02/17 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
微信小程序实现图片上传功能实例(前端+PHP后端)
2018/01/10 Javascript
MUI 实现侧滑菜单及其主体部分上下滑动的方法
2018/01/25 Javascript
使用vue-router设置每个页面的title方法
2018/02/11 Javascript
JS代码实现电脑配置检测功能
2018/03/21 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
2015/03/19 Python
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
django框架自定义用户表操作示例
2018/08/07 Python
python安装scipy的步骤解析
2019/09/28 Python
Mac 使用python3的matplot画图不显示的解决
2019/11/23 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
德国珠宝和手表在线商店:VALMANO
2019/03/24 全球购物
应急管理工作总结2015
2015/05/04 职场文书
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python
教你用Java Swing实现自助取款机系统
2021/06/11 Java/Android