javascript - 属性值更改后 IE8 不刷新类

标签 javascript html css internet-explorer-8

上下文: 我有一个使用 HTML5 data- attributes 的 HTML 页面.我的一些 CSS 样式使用 attribute selectors根据这些自定义属性的值设置元素样式。

问题:当我使用 JavaScript 更新 data- 属性的值时,Chrome 通过重新设置受影响的元素的样式来正确响应,但 IE8(我需要支持)不会...不是立即.让 IE8 更新样式的唯一方法是通过其他方式直接摆弄 CSS 样式(例如删除或修改 class 属性)。

示例:

<html>
<head>    
    <style type="text/css">    
        .Test[data-foo="bar"]{ background-color: Green; }    
        .Test[data-foo="baz"]{ background-color: Red; }        
    </style>

    <script src="scripts/jquery-1.8.3.js" type="text/javascript"></script>    
    <script type="text/javascript">
        function change(div) { $(div).attr("data-foo", "baz"); }
        function toggleTest() { $("DIV").toggleClass("Test"); }    
    </script>
</head>
<body>
    <div data-foo="bar" onclick="change(this);" class="Test">Testing</div>
    <div data-foo="bar" onclick="change(this);" class="Test">Testing</div>
    <input type="button" onclick="toggleTest()" value="Toggle Class" />
</body>
</html>

在 Chrome 中,您可以点击 Test1 和 Test2 栏,它们会立即变为红色。在 IE8 中,您必须单击栏,然后单击按钮两次(一次删除类,再次恢复类)。

问题:解决方法是什么?显然我已经确定了一个(添加/删除类),但它很难看。是否有一种优雅、不显眼的方式来强制 IE8 重新评估元素的样式,而不用弄乱元素的属性?

最佳答案

虽然许多属性在更改时会导致重排,但 Internet Explorer 8 中的 data-* 属性似乎不会出现这种情况。更改这些属性不会立即导致重绘元素- 您将必须手动触发回流。

el.setAttribute("data-foo", "foo");
el.style.opacity = 1;

在上面的示例中,我通过将元素的不透明度设置为 1 来触发重排。您还可以将缩放属性设置为 1,甚至将元素的类名设置为其自身:

el.className = el.className;

任何这些都应该立即应用基于属性选择器的新样式。好消息是,这是在 IE8 中出现的,这是一种在广泛使用数据属性之前的浏览器,所以虽然我们不得不在那里遭受一些痛苦,但我们不必使用 IE9 或 IE10 - 这两个版本都可以在没有任何特别注意回流焊问题。

关于javascript - 属性值更改后 IE8 不刷新类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14222123/

相关文章:

html - 对表行中的所有元素应用缩放变换

html - 为什么空列在 CSS Grid 中不折叠?

javascript - JQuery UI Datepicker 改变一天的样式

javascript - react ,缺少 map 迭代的唯一键

javascript - 使用本地日期设置和获取 HTMLInputElement.valueAsDate 的正确方法是什么?

css - 如何对表格进行 CSS 样式设置,使单元格最多为屏幕高度的 30%,并在更高时使用滚动条?

css - 设置位置时网页页脚出现问题

javascript - 通过javascript检查事件元素是否具有特定类

javascript - 为什么没有更多的 oEmbed 提供商在其端点上启用跨域资源共享?

jquery - 即使在网站刷新后如何检查跨度是否有值(value)