在我看来,所有现代浏览器,包括最新版本的 Chrome、Safari 和 FireFox(可能从一开始)都尊重 ; 中的元素的顺序style
和link
元素head
。即使在运行时使用 JavaScript 动态创建和添加时也是如此。
比如这里red.css
和green.css
都指定body背景颜色;第一个将主体背景设置为红色,第二个将其设置为绿色:
<head>
<!-- other code -->
<link rel="stylesheet" href="red.css" type="text/css">
<link rel="stylesheet" href="green.css" type="text/css">
</head>
结果是主体的背景颜色为绿色,因为green.css
它被放置在之后red.css
并在之后进行评估。
即使link
元素是动态创建并插入到头部的,元素的顺序似乎也是正确的。例如,动态创建一个link
加载的元素green.css
只会将主体背景颜色设置为绿色,如果它插入到red.css
.
然而,唯一似乎不尊重这一点的浏览器是 Internet Explorer(至少 IE 7-9 不这样做)。看来,对于 IE,最近添加的元素link
或style
元素是在已经评估的所有内容之上评估的;在运行时添加时,它不尊重树顺序。
是否尊重订单非标准行为,或者这是 Internet Explorer 错误?如何为 Internet Explorer 解决此问题?
我提出的一个想法(可行)是动态删除所有现有元素link
并style
以相同的树顺序将它们添加回来——这是我希望它们被评估的顺序。
任何见解将不胜感激。
更新
这是根据要求提供的更详细的代码示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="red.css" type="text/css"> <!-- sets red -->
</head>
<body>
<script type="text/javascript">
setTimeout(function() {
// IE7-8 does not support referencing document.head
var head = document.getElementsByTagName("head")[0];
var link = document.createElement("link");
link.setAttribute("href", "green.css");
link.setAttribute("rel", "stylesheet");
link.setAttribute("type", "text/css");
// All modern browesers will leave the background
// color red, except IE will set it green.
head.insertBefore(link, head.firstChild);
// Now comment out the above line and try adding the link
// using this instead. All modern browsers (including IE)
// will set the body background color green after two seconds.
// IE seems to always evaluate the last dynamically added link.
// head.appendChild(link);
}, 2000);
</script>
</body>
</html>
内容red.css
:
body { background-color: red; }
内容green.css
:
body { background-color: green; }