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 相关文章推荐
javascript EXCEL 操作类代码
Jul 30 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
Oct 17 Javascript
jquery form 隐藏的input 选择
Apr 29 Javascript
js实现类似于add(1)(2)(3)调用方式的方法
Mar 04 Javascript
JavaScript实现文字跟随鼠标特效
Aug 06 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
Mar 25 Javascript
利用jquery实现下拉框的禁用与启用
Dec 07 Javascript
bootstrap导航、选项卡实现代码
Dec 28 Javascript
支付宝小程序tabbar底部导航
Nov 06 Javascript
20个必会的JavaScript面试题(小结)
Jul 02 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
Oct 14 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
Oct 09 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 VS ASP
2006/10/09 PHP
PHP file_get_contents设置超时处理方法
2013/09/30 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
JScript的条件编译
2007/05/29 Javascript
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
简单的js分页脚本
2009/05/21 Javascript
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
jQuery Tips 为AJAX回调函数传递额外参数的方法
2010/12/28 Javascript
面向对象Javascript核心支持代码分享
2012/05/23 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
javascript实现当前页导航激活的方法
2015/02/27 Javascript
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
vscode 开发Vue项目的方法步骤
2018/11/25 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
Python生成pdf文件的方法
2014/08/04 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
2019/05/21 Python
匡威比利时官网:Converse Belgium
2017/04/13 全球购物
Bogner美国官网:滑雪服中的”Dior”
2018/01/30 全球购物
匈牙利超级网上商店和优惠:Alza.hu
2019/12/17 全球购物
房地产销售员的自我评价分享
2013/12/04 职场文书
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
家具促销活动方案
2014/02/16 职场文书
企业文化建设实施方案
2014/03/22 职场文书
C++程序员求职信范文
2014/04/14 职场文书
家长对孩子的评语
2014/04/18 职场文书
工商管理自荐书
2014/07/06 职场文书
优秀教师单行材料
2014/12/16 职场文书
计划生育工作总结2015
2015/04/03 职场文书
保密法制宣传月活动总结
2015/05/07 职场文书
校园之声广播稿
2015/08/18 职场文书
浅析Python中的套接字编程
2021/06/22 Python
javascript代码简写的几种常用方式汇总
2021/08/23 Javascript