2015-05-21 3 views
5

Ho riscontrato un grave problema di prestazioni quando il mio codice JS è in esecuzione su IE (10, 11). È 10 volte più lento rispetto ad altri browser.Prestazioni di manipolazione DOM IE

Ho fatto un po 'di profilazione e sembra che innerHTML e createElement sia super lento.

Ho provato a ottimizzare utilizzando createDocumentFragment, che velocizza anche il mio codice in altri browser, ma le prestazioni in IE rimangono intatte.

Ecco il codice

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Document</title> 
</head> 
<body> 
    <div id="content"></div> 
    <script> 
     function a() { 
      var CNT = 100000; 
      var start, end, time; 
      start = window.performance.now(); 
      var frag = document.createDocumentFragment(); 
      for (var i = 0, l = CNT; i < l; ++i) { 
       var el = document.createElement('div'); 
       el.innerHTML = i; 
       frag.appendChild(el); 
      } 
      document.body.appendChild(frag); 
      end = window.performance.now(); 
      time = end - start; 
      console.log('time', time); 
     } 
     a(); 
    </script> 
</body> 
</html> 

Ho cercato di ottimizzare utilizzando concatenazione di stringhe per evitare operazioni DOM costose, che ha reso molto più veloce, ma ancora molto lento quando si confrontano ad altri browser.

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Document</title> 
</head> 
<body> 
    <div id="content"></div> 
    <script> 
     function a() { 
      var CNT = 100000; 
      var start, end, time; 
      start = window.performance.now(); 
      var frag = document.createDocumentFragment(); 
      var content = ''; 
      for (var i = 0, l = CNT; i < l; ++i) { 
       content += '<div>' + i + '</div>'; 
      } 
      var holder = document.createElement('div'); 
      holder.innerHTML = content; 
      frag.appendChild(holder); 
      document.body.appendChild(frag); 
      end = window.performance.now(); 
      time = end - start; 
      console.log('time', time); 
     } 
     a(); 
    </script> 
</body> 
</html> 

C'è un modo per rendere veloce DOM dinamico in IE? Ho bisogno di generare alberi DOM piuttosto grandi usando Javascript con alcuni template e le prestazioni di IE sono solo un killer in questo caso.

Qualsiasi aiuto?

+0

Ho trovato qualcosa di simile a http://stackoverflow.com/questions/14080365/bad-performance-ie-using-documentfragment –

+0

Potrebbe essere l'aggiornamento dello schermo che è lento, si potrebbe provare a fare l'inserimento durante l'animationFrame utilizzando https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame –

risposta