2013-09-10 3 views
6

У меня есть большое количество datarows в json-файле, который я загружаю через ajax.Лучший способ вставить шаблон строки html

Затем я создаю довольно некоторый код html, содержащий некоторые данные для каждой строки, подобной этой.

var gl = $("#gameslist"); 
$.each(DATA.games, function(index, value) { 
    gl.append('<div>... lots of html code here ... '+value.somedata+'</div>'); 
} 

Это кажется довольно медленным, особенно в браузере для мобильных сафари. есть ли какие-либо трюки или плагины jquery, чтобы ускорить это?

редактировать: в соответствии с просьбой, вот Аякс вызов:

$.ajax({ 
    dataType: "json", 
    url: "../games.json" 
}) 
.done(function(gamesjson){ 
    DATA = gamesjson; 
    buildPage(); // this one is calling the above code 
    }) 
.fail(function(){ 
    console.log("games.json error"); 
    }) 
; 
+0

Я не знаю, как JQuery делает это, но 'insertAdjecentHTML' в чистом Javascript может быть значительно быстрее. –

+0

Не использовать [.each] (http://jsperf.com/browser-diet-jquery-each-vs-for-loop) и вместо этого использовать цикл for? – CodingIntrigue

+0

Посмотрите, поможет ли это http://stackoverflow.com/questions/5361810/fast-way-to-dynamically-fill-table-with-data-from-json-in-javascript – Anand

ответ

4

Это медленно причина DATA.games может быть огромной, и вы вызываете (ки, Кэшируемые) $("#gameslist")
но вы используете append() для каждой итерации цикла.

Чтобы ускорить работу, создайте переменную, которая будет содержать строковое представление вашего HTML (содержащего DIV и данные), чем внутри цикла for, присоединяется к строке с использованием +=, чем когда цикл завершен, добавляется только один раз к вашему $("#gameslist")

Здесь я создал live demo, чтобы показать вам резкое различие:

для всего итераций и HTML компл exity только из элементов/итерации
Использование .append() внутри петли                   = ~ 100мс
Использование .append() только один раз (после цикла) = ~ 30ms

Оба теста в for loop ... Это было всего лишь абу t используя .append() в правильном направлении/место.

Теперь назад о различий в скорости между $.each и старым добрым for, я нашел интересный JSPerf:

http://jsperf.com/browser-diet-jquery-each-vs-for-loop (Примечание: выше, тем лучше)


Напоминание: Тестовый фрагмент:

var initialTime = new Date().getTime(); 

for(var i=0; i<10000; i++){ 
    // your code 
} 

console.log(new Date.getTime() - initialTime); // ms 
3

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

var gl = document.createDocumentFragment(); 

$.each(DATA.games, function(index, value) { 
    var div = document.createElement('div'), 
     text = document.createTextNode('... lots of html code here ... '+value.somedata); 

    gl.appendChild(div.appendChild(text)); 
} 

$("#gameslist").append(gl); 
Смежные вопросы