4

最近のバージョンの Chrome、Safari、FireFox (おそらく最初から) を含む最新のブラウザーはすべて、 ;内の要素stylelink要素の順序を尊重しているように思えます。head動的に作成され、JavaScript を使用して実行時に追加された場合でも。

たとえば、ここred.cssgreen.css両方でボディの背景色を指定します。1 つ目はボディの背景を赤に設定し、2 つ目は緑に設定します。

<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; }
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 に答える