【问题标题】:IE8 does not apply the style even when its Developer Tools shows itIE8 不应用该样式,即使它的开发者工具显示它
【发布时间】:2014-02-23 13:57:46
【问题描述】:

我想知道是否有人遇到过这个问题以及他们做了什么来解决它。 IE,没有为我在运行时添加的类应用样式(jQuery)。奇怪的是,开发者工具显示它应该被应用。见下图。

“fa-bars”元素的父元素具有“blue”类。在这种情况下,我在 $(document).ready() 中添加了“blue”类。如果我在 HTML 标记上添加“蓝色”类(而不是在运行时添加),它会正确应用样式。但这不是我想做的。

我只在 IE 上遇到这个问题(我使用 IE8),但 Chrome 和 FF 都按我的预期(正确)呈现页面。关于如何解决这个问题的任何想法?

只有在呈现伪内容(例如,FontAwesome)时才会出现问题。如果我用纯文本替换元素,它可以工作。

添加:

这是我的完整 HTML,其中包含 FontAwesome 和 jQuery 的 CDN 链接:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width" />
        <title>Test</title>
        <link href="http://netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
        <script src="http://code.jquery.com/jquery-1.10.2.min.js" type="text/javascript"></script>
        <script type="text/javascript">
            $(document).ready(function () {
                $('.nav-toc').addClass('blue');
            });
        </script>
        <style type="text/css">
            .fa {font-size: 1.5em;}
            .nav-toc {color: red;}
            .blue {color: blue;}
        </style>
    </head>

    <body class="pson-green">
        <div id="master-body">
            <!-- Top banner (Menu) -->
            <div id="master-header">
                <div class="content-wrapper">
                    <div id="nav-grp-toc" class="nav-container">
                        <div class="nav-btn nav-toc" title="Contents Menu"><i class="fa fa-bars"></i></div>
                    </div><div id="nav-grp-help" class="nav-container">
                        <div class="nav-btn nav-help" title="Help"><i class="fa fa-question"></i></div>
                    </div><div id="nav-grp-counters" class="nav-container">
                        <div id="page-counter" class="nav-page counter-panel">
                            <div id="current-page" class="current-count" title="Current page number"></div>
                            <div id="total-pages" class="max-count" title="Total number of pages"></div>
                        </div>
                        <div id="question-counter" class="nav-quiz counter-panel">
                            <div id="current-question" class="current-count" class="Current question number"></div>
                            <div id="total-questions" class="max-count" title="Total number of questions"></div>
                        </div>
                    </div><div id="nav-grp-steppers" class="nav-container">
                        <div class="nav-btn nav-page nav-prev" title="Back"><i class="fa fa-chevron-left"></i></div>
                        <div class="nav-btn nav-page nav-next" title="Next"><i class="fa fa-chevron-right"></i></div>
                    </div><div id="nav-grp-exit" class="nav-container">
                        <div class="nav-btn nav-page nav-exit" title="Exit Course"><i class="fa fa-sign-out"></i></div>
                    </div>
                </div>
                <div id="dimmer-for-header" class="dimmer"></div>
            </div>
        </div>
    </body>   
</html>

【问题讨论】:

  • @crush,你是什么意思?
  • 他的意思是发布你的代码
  • 好吧,“内容”太笼统了。但感谢澄清
  • 感觉您的 jQuery 甚至没有运行。检查您的脚本调试器/控制台,看看是否有类似$ is undefined
  • @Deryck,它正在我身上运行,使用我发布的这段代码(我复制并粘贴并重新测试)。

标签: css internet-explorer-8 pseudo-element


【解决方案1】:

我想我可能已经找到了答案。从我对类似帖子的搜索中可以看出,问题在于 IE 对伪元素的处理。不幸的是,除了SO item 之外,我对这些帖子的许多答案/建议似乎对我不起作用。基本上,它建议通过临时向 DOM 添加一个删除所有伪内容的样式标记,然后立即删除该样式标记来强制 IE 重新绘制伪元素。当与基于此SO item 的 IE8 检查结合使用时,它似乎有效。我将此添加到我的脚本中:

var ie = (function () {
    var undef,
    v = 3,
    div = document.createElement('div'),
    all = div.getElementsByTagName('i');
    while (
        div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
                        all[0]
                        );
   return v > 4 ? v : undef;
 } ());

 function redrawPseudos() {
    var head = document.getElementsByTagName('head')[0],
    style = document.createElement('style');
    style.type = 'text/css';
    style.styleSheet.cssText = ':before,:after{content:none !important;}';
    head.appendChild(style);
    setTimeout(function () {
        head.removeChild(style);
    }, 0);
 }

所以当我必须添加/删除一个类时,我希望这会影响伪元素的样式,我必须这样做:

 $('.class1').addClass('newclass');   
 if (ie === 8) {
    redrawPseudos();
 }

这可能是一种昂贵的方式。但我只有不到十几个伪元素。

添加:

您可以通过将选择器传递给 redrawPseudos() 并将其包含到样式中来改进这一点。这会将重绘限制为选择器标识的元素。

function redrawPseudos(sel) {
    ...
    style.styleSheet.cssText = sel + ':before, ' + sel + ':after, ' + sel + ' *:before, ' + sel + ' *:after ' + '{content:none !important;}';
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2014-07-25
    • 1970-01-01
    • 2011-04-09
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多