2012-06-22 4 views
1

У меня есть немного javascript, который динамически добавляет элементы на мою страницу. Проблема заключается в том, что для любого заданного запуска создаются сотни элементов, и хотя загрузка одного элемента занимает меньше секунды, на всю страницу может потребоваться 30 секунд или больше для полной загрузки, тогда все внезапно появляется на стр. Мой вопрос: как я могу обновить страницу, чтобы мой динамически созданный элемент отображался сразу после его создания?обновить html при динамическом добавлении элементов

 var newDiv = document.createElement('div'); 

     for (var val in array) { 
      var newCanvas = document.createElement('div'); 
      newCanvas.className = "graph"; 
      newDiv.appendChild(newCanvas); 

      drawGraph(val, newCanvas); //adds a bunch of elements to newCanvas 
      addTitle(val, newCanvas);   //adds another 
      addDescription(val, newCanvas); //adds another 
     } 

     document.body.appendChild(newDiv); 
+1

, пожалуйста, напишите код – matt3141

+0

Является ли ваш javascript размещен в нижней части файла? –

+1

Можем ли мы увидеть код? Похоже, вы не добавляете каждый элемент отдельно в dom или не скрываете его до определенного времени. – fanfavorite

ответ

3

Крайне неэффективно динамически добавлять сотни элементов в DOM по одному за раз. Каждый раз, когда вы добавляете в DOM один видимый элемент, вы вынуждаете оплату всего дерева DOM, за которым следует перерисовка экрана.

Вы должны использовать JavaScript для создания фрагмента DOM (например, элемента div), к которому вы можете добавить новые элементы DOM. Когда у вас появятся все новые элементы, вы можете опционально добавить их все, переведя дочерние элементы этого фрагмента в содержащий элемент DOM в живом дереве DOM.

Ниже приведен пример функции, которая создает элемент DOM с набором указанных атрибутов и необязательных дочерних элементов. После того, как элемент и его дочерние элементы назначены переменной myDiv, этот элемент добавляется к телу документа.

function dom(tag, attributes) { 
    var el, key, children, child; 
    el = document.createElement(tag); 
    for (key in attributes) { 
     if (attributes.hasOwnProperty(key)) { 
      el[key] = attributes[key]; 
     } 
    } 
    for (i = 2, l = arguments.length; i < l; i++) { 
     child = arguments[i]; 
     if (child.nodeType == 1 || child.nodeType == 3) { 
      el.appendChild(child); 
     } 
    } 
    return el; 
} 

var myDiv = dom(
    'div', 
    { id: 'myDiv', className: 'container' }, 
    dom(
     'p', 
     { className: 'firstParagraph' }, 
     document.createTextNode('If you enjoy this movie, '), 
     dom(
      'a', 
      { href: 'http://www.amazon.com', title: 'Buy this movie at Amazon.com!' }, 
      document.createTextNode('buy it at Amazon.com') 
     ), 
     document.createTextNode('!') 
    ), 
    dom(
     'p', 
     {}, 
     document.createTextNode('The quick brown fox jumps over the lazy dog.') 
    ) 
); 

document.body.appendChild(myDiv); 
+0

Отправленный код. Вы были правы, это сократило время загрузки в 10 раз! Но он по-прежнему выглядит неряшливо, когда страница занимает 5 секунд для загрузки, а затем рисует все сразу. Есть ли способ сначала нарисовать первичные элементы (те, на которые я рисую графики), а затем потянуть каждый из этих div по одному без перерисовывания всей страницы? Благодаря тонну! – user1429419

0

Поместите всю загрузку элемента после постройки DOM.

использовать т.е.

$(document).ready(function(){ 
    // induvidual elements loadings 
}); 

Знак $ обозначает Jquery. Для использования jquery добавьте блок сценария.

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script> 

Таким образом, базовая структура будет полностью загружаться, а отдельные части могут занять свое время.

+1

jQuery никогда не был mesioned mate, вы можете сказать ему, что ваш метод требует jQuery ... –

Смежные вопросы