IE、Javascript和回流

IE、Javascript和回流,javascript,internet-explorer,Javascript,Internet Explorer,我有一个javascript函数,可以更改大量dom节点(>5000)的css显示('block','none')。我正在尽可能快地做到这一点 IE会中断javascript回流并绘制屏幕,还是等到javascript引擎将控制权返回到浏览器?在所有节点都设置了显示之前,我希望避免浏览器中的任何额外工作 我注意到,在JQuery的show()方法中,DOM操作和注释被放在一个紧密的循环中 //设置第二个循环中元素的显示 //避免持续回流 (第51行) 谢谢 James如果您隐藏了一个公共父级,然

我有一个javascript函数,可以更改大量dom节点(>5000)的css显示('block','none')。我正在尽可能快地做到这一点

IE会中断javascript回流并绘制屏幕,还是等到javascript引擎将控制权返回到浏览器?在所有节点都设置了显示之前,我希望避免浏览器中的任何额外工作

我注意到,在JQuery的show()方法中,DOM操作和注释被放在一个紧密的循环中

//设置第二个循环中元素的显示
//避免持续回流

(第51行)

谢谢


James

如果您隐藏了一个公共父级,然后隐藏了元素,然后显示了父级,那么应该可以防止它不必要地重新绘制。

当JS更改每个元素时,浏览器将重新显示页面。正如您所建议的,最好将显示器的变化保持到最后。这对用户来说也会感觉更平滑、更快(即使不是真的)

我想:

  • 克隆封装要处理的节点的节点
  • 对克隆的节点子节点执行处理
  • 用克隆替换原始节点

  • 如果处理需要很长时间(超过0.5秒),考虑在显示器上设置一些东西,让用户知道某事正在发生。将原始内容慢慢淡出到大约50%的不透明度是一种简单的方法。

    使用CSS来显示和隐藏元素,方法是更改父元素的类名。我不久前做的一些测试表明,它比在每个元素上设置display属性快十倍左右。由于您只更改一个属性,因此它只会回流一次

    例如:

    <style>
    .State1 .InitiallyHidden { display: none; }
    .State2 .InitiallyShown { display: none; }
    </style>
    
    <script>
    function flip() {
       var o = document.getElementById('Parent');
       o.className = o.className = 'State1' ? 'State2' : 'State1';
    }
    </script>
    
    <input type="button" value="flip" onclick="flip();" />
    
    <div id="Parent" class="State1">
       <div class="InitiallyHidden">One</div>
       <div class="InitiallyShown">Two</div>
       <div class="InitiallyHidden">Three</div>
       <div class="InitiallyShown">Four</div>
    </div>
    
    
    .State1.InitiallyHidden{display:none;}
    .State2.InitiallyShown{display:none;}
    函数翻转(){
    var o=document.getElementById('Parent');
    o、 className=o.className='State1'?'State2':'State1';
    }
    一个
    两个
    三
    四
    
    用户是否会看到闪烁?浏览器在javascript完成运行之前不会绘制吗?我运行了一些测试,这似乎会使性能更差。Chrome运行了29ms->30ms,IE8 432ms->493Perhaps我误解了你所写的内容,但是浏览器在JavaScript执行时不会进行可视更改。JS必须放弃控制权。这就是为什么您必须对任何持续时间过长的JS使用SetTimeout()。在大多数(如果不是所有)浏览器中,如果JS不将控制权返回浏览器,即使是动画GIF也会冻结。嗯,好吧,也许我弄糊涂了。谢谢你的纠正这是正确的方法。如果您发现自己更改了5000个节点,那么您就做错了。