如何最准确地强制浏览器重新计算整个样式或单个元素的样式?
我不能简单地通过替换innerHTML
或其他内容来重新加载整个DOM,因为那样会丢失所有附加的事件处理程序,因此,我需要使用会迫使浏览器重新计算样式的内容。这确实需要与IE8一起使用。
我曾尝试搜索任何可解决此问题的方法,但至少没有使用“重新计算样式”一词,我找不到任何地方,而我可以找到的关于“重新加载样式”的唯一相关结果是“ How to refresh the style of a page after css switch”。但是,该问题对我不起作用,因为我不是直接更改需要更改样式的元素的类,而是更改其同级。
[Here is a simplified demo,仅提供相关代码:
HTML:
<span id="foo">This gets a class,</span>
<div>...and this should become red,</div>
<button onclick="document.getElementById('foo').className = 'foo';">...if you click here</button>
CSS:
span.foo + div {color:red;}
如果您测试该演示,至少要在IE11的IE8仿真模式下,您将看到样式不会更新。对我来说,它仅在我在F12界面的DOM查看器中选择节点后才更新。 (PS:IE8仿真模式位于IE11的F12界面的底部选项卡中。)
在+ selector
所针对的元素的祖先上切换类:
$('body').addClass('ie_force_restyle').removeClass('ie_force_restyle');
这将强制IE8-重新执行与给定元素的所有后代匹配的选择器。
为了更加有效,您也可以定位#foo
的父对象:
$('#foo').parent().addClass('ie_force_restyle').removeClass('ie_force_restyle');
在Windows 7 x64上测试-IE8。
注意:我仅针对相邻的兄弟选择器+
测试了此设置,但我很确定它应适用于~
,:first-child
和其他对旧IE中的DOM更改无反应的选择器。
[[虽然我不能主张独创性,但是在为IE8-编写:checked
pseudo-class polyfill时,我已经在Internet的黑暗角落找到了该解决方案。
[我发现我可以通过使用通用CSS选择器添加和删除样式标签来强制重新计算整个Java样式:
:checked
受此var head = document.querySelector("head");
var style = head.appendChild(document.createElement("style"));
var styleSheet = document.styleSheets[document.styleSheets.length - 1];
styleSheet.insertRule("* { }", 0);
head.removeChild(style);
的启发。