4

在我看来,所有现代浏览器,包括最新版本的 Chrome、Safari 和 FireFox(可能从一开始)都尊重 ; 中的元素的顺序stylelink元素head。即使在运行时使用 JavaScript 动态创建和添加时也是如此。

比如这里red.cssgreen.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,最近添加的元素linkstyle元素是在已经评估的所有内容之上评估的;在运行时添加时,它不尊重树顺序。

是否尊重订单非标准行为,或者这是 Internet Explorer 错误?如何为 Internet Explorer 解决此问题?

我提出的一个想法(可行)是动态删除所有现有元素linkstyle以相同的树顺序将它们添加回来——这是我希望它们被评估的顺序。

任何见解将不胜感激。

更新

这是根据要求提供的更详细的代码示例:

<!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; }
4

3 回答 3

3

如果您不是重新附加样式表,而是切换他们的一个属性来强制重新渲染怎么办?例如,您可以尝试遍历所有link/style元素,将它们的media属性设置为none,然后将其重新设置回原来的值。

于 2012-09-03T02:02:58.983 回答
1

您没有告诉我们您真正试图通过插入样式表来解决什么问题的详细信息,但很可能有更好的方法来解决实际问题,而不是按特定顺序动态插入样式表列表。

例如,您可以同时拥有两个样式表(稍微修改以关闭另一个类),并通过向<body>标签添加或删除单个类,您可以触发从绿色到红色的更改,反之亦然。

于 2012-09-03T06:24:29.340 回答
0

您指的是 CASCADING - CASCADING 样式表 (CSS) 工作方式的一个非常重要的功能。所有浏览器都以这种方式工作,包括 IE。如果他们没有级联,那将是一个大问题。

但是,有些样式在某些版本的 IE 中不起作用 - 也许您正在查看的是样式不能正常工作,而不是级联不能正常工作。你想发布一个具体的例子吗?

于 2012-09-03T01:13:29.477 回答