Nejlepší způsob, jak vytvořit velké statické prvky DOM v JavaScriptu?

Poznámka:Pokud nenávidíte čtení, konečnou odpověď naleznete v souhrnu níže

Možná je opravdu nepotřebujete vytvářet pomocí jQuery.

Pokud je struktura tohoto html komplikovaná (proto použití přístupu document.createElement by bylo přehnané), šel bych s innerHTML atribut.

// somewhere in your code, preferably outside of global scope
var div = document.createElement('div')
div.id = 'mycustomdiv'
document.getElementsByTagName('body')[0].appendChild(div);
// assuming elements contains string of html with your elements
div.innerHTML = elements;

Tímto způsobem se vyhnete (opět za předpokladu) zbytečné režii při vytváření a obalování prvků v objektu jQuery.

Aktualizace:test pro sebe, jaká je nejrychlejší metoda http://jsperf.com/creating-complex-elements. Tento test potvrzuje, že když se snažíte vyždímat každý kousek výkonu, vraťte se k vanilkovému javascriptu a klasickým DOM operacím.

Aktualizace 2. Chcete-li zjistit, proč metoda vnitřní HTML ve Firefoxu 10 mají tak špatné výsledky ve vztahu k předání celého řetězce do jQuery.append, podíval jsem se na zdroj jQuery.

Jak se ukázalo (v jQuery 1.7.1), používají ještě další způsob vytváření prvků dom pomocí document.createDocumentFragment (samozřejmě s některými záložními možnostmi pro prohlížeče, které nemají správnou podporu).

DocumentFragments jsou uzly DOM. Nikdy nejsou součástí hlavního stromu DOM. Obvyklým případem použití je vytvoření fragmentu dokumentu, připojení prvků k fragmentu dokumentu a následné připojení fragmentu dokumentu ke stromu DOM. Ve stromu DOM je fragment dokumentu nahrazen všemi jeho potomky.

Od fragmentu dokumentu je v paměti a není součástí hlavního stromu DOM, připojení potomků k němu nezpůsobí přeformátování stránky .

Za předpokladu, že je k dispozici createDocumentFragment, ukazuje se, že je to nejlepší přístup z hlediska celkového výkonu skriptu napříč prohlížeči.

Takže shrnuto:

stojím opravený. Pokud při vytváření nových prvků DOM hledáte nejlepší výkon v různých prohlížečích, zaměřte se na fragmenty dokumentů (použijte jQuery, pokud nechcete řešit různé rohové případy sami).

Více informací o documentFragment najdete v tomto příspěvku na blogu Johna Resiga http://ejohn.org/blog/dom-documentfragments/


Podrobná analýza 3 běžných způsobů vytváření DOM v JS a nejlepší přístup.

Poskytnu 3 způsoby, jak vytvořit velký DOM a jejich klady a zápory, a samozřejmě nejoptimalizovanější způsob pro vytváření velkých DOM a proč. Sečteno a podtrženo, při vytváření DOM v js jsou nativní metody JS a DOM váš přítel, ne nepoužívejte Jquery, pokud neexistuje jiný způsob (což je nepravděpodobné).

Testovací data pro srovnání: Vytvořeno 400 řádků s 5 sloupci a připojené k DOM.testData je seznam objektů, které získáte z backendu ve formě json k vytvoření tabulky.

Připojený snímek výsledku testu doby provedení pro různé prohlížeče HTML

<div id="employeeListContainer1"></div>
<table id="employeeList2">
<thead>
 <tr>
 <th>First Name</th>
 <th>Last Name</th>
 <th>Title</th>
 <th>ID</th>
 <th>Department</th>
 </tr>
</thead>

1. způsob:Zřetězení řetězců (Nejoptimalizovanější způsob z hlediska výkonu napříč prohlížeči)

var tableElementContainer1 = document.getElementById("employeeListContainer1"),
 temptableHolder = '<table><thead><tr><th>First Name</th><th>Last Name</th><th>Title</th><th>ID</th><th>Department</th></tr></thead><tbody>';
 for(var i=0,len=testData.length; i<len; i++){
 temptableHolder += '<tr><td>' + testData[i].firstName + '</td><td>' + testData[i].lastName + '</td><td>' + testData[i].title
 + '</td><td>' + testData[i].id + '</td><td>' + testData[i].department + '</td></tr>';
 }
 temptableHolder += '</tbody></table>';
 tableElementContainer1.innerHTML = temptableHolder ;

Výhody:- Nejrychlejší doba spuštění ve Firefoxu/Chrome/IE/Safari (3 až 5 milisekund napříč prohlížeči) . Měřeno prostřednictvím rozhraní API performance.now() a console.time().

Nevýhody:- Když je počet sloupců větší a potřebujete nastavit mnoho atributů, může být práce s řetězci trochu obtížná a méně udržitelná.

2. způsob:Nativní dokument Js document.createElement() (Toto je druhý nejlepší přístup z hlediska výkonu napříč prohlížeči)

var tableBody = document.createElement('tbody'),
tableElement2 = document.getElementById("employeeList2"), 
 for(var i=0,len=testData.length; i<len; i++){
 tableRow = document.createElement("tr");
 for(var k in testData[i]){
 rowCell = document.createElement("td");
 rowCell.appendChild(document.createTextNode(testData[i][k]));
 tableRow.appendChild(rowCell);
 }
 tableBody.appendChild(tableRow);
 }
tableElement2.appendChild(tableBody);

Výhody:– 2. nejrychlejší doba spuštění ve Firefoxu/Chrome/Safari (5 až 12 milisekund napříč prohlížeči) . Měřeno prostřednictvím rozhraní API performance.now() a console.time().- Více udržitelných než 1. přístup

Nevýhody:– Doba provádění je delší v prohlížečích IE, 90+ milsec

3. způsob:Použití Jquery k vytvoření DOM (Moje rada je nepoužívejte to)

var tableBody = $('<tbody></tbody>'),
 tableElement2 = document.getElementById("employeeList2"), 
 for(var i=0,len=testData.length; i<len; i++){
 tableRow = $("<tr></tr>");
 for(var k in testData[i]){
 rowCell = $("<td></td>");
 rowCell.append(testData[i][k]);
 tableRow.append(rowCell);
 }
 tableBody.append(tableRow);
 }
tableElement2.append(tableBody);

Výhody:– Snadné přidávání atributů/tříd/stylů k prvkům a je snadno čitelný a udržitelný.

Nevýhody:– Nejhorší doba provádění ve všech prohlížečích (220 ms až 330 ms) , nejpomalejší čísla jsou v IE


Můžete zkusit načíst statický blok HTML pomocí AJAX místo jeho uložení na stránku samotnou. Umožňuje vám být flexibilnější s tím, jaký typ bloku chcete v budoucnu vložit.

Alternativně (toto je jen náhodný nápad, který není příliš dobře propracovaný), můžete „strukturu“ uložit jako data JSON a poté ji dynamicky analyzovat. Možná něco jako {"div": {"div": {"span": "Text here"}}} pro <div><div><span>Text here</span></div></div> . Přesto bych šel do AJAXu. :)