есть некоторые вещи, которые вы можете сделать, чтобы оптимизировать его - и то, что сказал @nizan tomer, очень хорошо, псевдо-шаблонизация - это хороший шаблон.
Прежде всего.
var fieldTemplate = $$('.fieldTemplate')[0];
var fieldTr = fieldTemplate.clone(true, true);
вы должны сделать это следующим образом:
var templateHTML = somenode.getElement(".fieldTemplate").get("html"); // no need to clone it.
сам шаблон должен / может быть таким же, как предложено, например:
<td id="{id}">{something}</td>
прочитать его только один раз,нет необходимости клонировать его для каждого элемента - вместо этого используйте новый конструктор Element и просто установите innerHTML - обратите внимание, что ему не хватает <tr> </tr>
.
если у вас есть объект с данными, например:
var rows = [{
id: "row1",
something: "hello"
}, {
id: "row2",
something: "there"
}];
Array.each(function(obj, index) {
var newel = new Element("tr", {
html: templateHTML.substitute(obj)
});
// defer the inject so it's non-blocking of the UI thread:
newel.inject.delay(10, newel, parentTable);
// if you need to know when done, use a counter + index
// in a function and fire a ready.
});
или используйте фрагменты документа:
Element.implement({
docFragment: function(){
return document.createDocumentFragment();
}
});
(function() {
var fragment = Element.docFragment();
Array.each(function(obj) {
fragment.appendChild(new Element("tr", {
html: templateHTML.substitute(obj)
}));
});
// inject all in one go, single dom access
parentTable.appendChild(fragment);
})();
Я выполнил тест jsperf для обоих этих методов: http://jsperf.com/inject-vs-fragment-in-mootools
удивительный выигрыш хрома с ОГРОМНЫМ отрывом от Firefox и ie9.Также удивительно, что в Firefox отдельные инъекции выполняются быстрее, чем фрагменты.возможно, узким местом является то, что это TR в таблице, которая всегда была хитрой.
Для шаблонов: вы также можете посмотреть на использование чего-то вроде шаблонов mustache или underscore.js.