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 tools之tabs 选项卡/页签
Jul 25 Javascript
javascript学习(二)javascript常见问题总结
Jan 02 Javascript
jQuery ajax分页插件实例代码
Jan 27 Javascript
关于cookie的初识和运用(js和jq)
Apr 07 Javascript
详解jQuery的Cookie插件
Nov 23 Javascript
JavaScript仿支付宝6位数字密码输入框
Dec 29 Javascript
easy ui datagrid 从编辑框中获取值的方法
Feb 22 Javascript
使用clipboard.js实现复制功能的示例代码
Oct 16 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
Oct 25 Javascript
解决vue+webpack打包路径的问题
Mar 06 Javascript
Node.js中package.json中库的版本号(~和^)
Apr 02 Javascript
VUE : vue-cli中去掉路由中的井号#操作
Sep 04 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种方法删除字符串中间的空格
2014/03/10 PHP
PHP中加密解密函数与DES加密解密实例
2014/10/17 PHP
php读取目录及子目录下所有文件名的方法
2014/10/20 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
2018/12/06 PHP
各种常用浏览器getBoundingClientRect的解析
2009/05/21 Javascript
JQuery 获得绝对,相对位置的坐标方法
2010/02/09 Javascript
基于Jquery的开发个代阴影的对话框效果代码
2011/07/28 Javascript
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
javascript设计模式--策略模式之输入验证
2015/11/27 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
ionic3实战教程之随机布局瀑布流的实现方法
2017/12/28 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
vue生命周期的探索
2019/04/03 Javascript
vue日历/日程提醒/html5本地缓存功能
2019/09/02 Javascript
解决layui的使用以及针对select、radio等表单组件不显示的问题
2019/09/05 Javascript
vue登录注册实例详解
2019/09/14 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
微信小程序实现签字功能
2019/12/23 Javascript
JS面向对象编程实现的拖拽功能案例详解
2020/03/03 Javascript
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[54:28]EG vs OG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python追加元素到列表的方法
2015/07/28 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
2018/09/17 Python
python实现的MySQL增删改查操作实例小结
2018/12/19 Python
python 使用pdfminer3k 读取PDF文档的例子
2019/08/27 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
怎样写好自荐信和推荐信
2013/12/26 职场文书
食品采购员岗位职责
2014/04/14 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
JS前端使用Canvas快速实现手势解锁特效
2022/09/23 Javascript