JavaScript高级程序设计之DOM之DOM 操作技术之动态样式第10.2.2讲

能够把CSS 样式包含到HTML 页面中的元素有两个。其中,<link>元素用于包含来自外部的文件,
而<style>元素用于指定嵌入的样式。与动态脚本类似,所谓动态样式是指在页面刚加载时不存在的样

式;动态样式是在页面加载完成后动态添加到页面中的。

我们以下面这个典型的<link>元素为例:

<link rel="stylesheet" type="text/css" href="styles.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()函数的代码如下所示:
loadStyles("styles.css");
加载外部样式文件的过程是异步的,也就是加载样式与执行JavaScript 代码的过程没有固定的次序。
一般来说,知不知道样式已经加载完成并不重要;不过,也存在几种利用事件来检测这个过程是否完成
的技术,这些技术将在第13 章讨论。
另一种定义样式的方式是使用<style>元素来包含嵌入式CSS,如下所示:

<style type="text/css">
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、Safari、Chrome 和Opera 中运行,在IE 中则会报错。IE 将<style>视为
一个特殊的、与<script>类似的节点,不允许访问其子节点。事实上,IE 此时抛出的错误与向<script>
元素添加子节点时抛出的错误相同。解决IE 中这个问题的办法,就是访问元素的styleSheet 属性,
该属性又有一个cssText 属性,可以接受CSS 代码(第13 章将进一步讨论这两个属性),如下面的例
子所示。

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}");
这种方式会实时地向页面中添加样式,因此能够马上看到变化。
如果专门针对IE 编写代码,务必小心使用styleSheet.cssText 属性。在重用
同一个<style>元素并再次设置这个属性时,有可能会导致浏览器崩溃。同样,将
cssText 属性设置为空字符串也可能导致浏览器崩溃。我们希望IE 中的这个bug 能
够在将来被修复。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值