JavaScript插入动态样式
能够把CSS样式包含到HTML页面中的元素有两个。其中,<link>元素用于包含来自外部的文件,而<style>元素用于指定嵌入的样式。与动态脚本类似,所谓动态样式是指在页面刚加载时不存在的样式;动态样式是在页面加载完成后动态添加到页面中。
我们以下面这个典型的<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}");
相关推荐
张荣珍 2020-11-12
goawalk 2020-10-29
ahailanjianj 2020-10-10
clong 2020-08-23
hell0kitty 2020-07-28
leodengzx 2020-07-04
JayFighting 2020-06-28
89510194 2020-06-27
小灯光环 2020-06-11
yunsaiqing 2020-06-06
弱思 2020-06-04
mysteryrat 2020-06-02
liqinglin0 2020-06-01
jvm 2020-05-30
curiousL 2020-05-27