09. oktober 2008 - 12:58Der er
22 kommentarer og 1 løsning
Manipulering af DOM med store mængder data
Hejsa alle
Jeg arbejder på en hjemmeside hvor jeg skal tilføje en masse data ind i en tabel via javascript. Indholder bliver loadet og tilføjet til en tabel med jQuery's .load() funktion. Problemet er at siden er utrolig lang tid om at loade DOM'en færdigt, så der går lang tid før man kan scrolle på siden og lign.
Så mit spørgsmål går i bund og grund ud på hvad man skal være opmærksom på når man skal manipulere med DOM'en med store mængder data via javascript - og hvordan man kan optimere det mest muligt.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Nu ved jeg ikke hvad jQuery udfører behind the scenes, men jeg har hørt udsagn om, at den bl.a. bruger innerHTML, og det, du skriver, får mig til at tro, at du serverer html ind i det, der skal loades ...
-- den absolut smarteste og hurtigste måde at gøre det på, er at servere data i json eller xml, i dette tilfælde er json så meget mere direkte at bruge, og så arbejde ud fra et (eller flere !-) template(s), som du kan klone og befolke med de data, du har !o]
Det er absolut spild af båndbredde og serverens tid og kræfter, da en opbygning af en json-streng vil kunne klares på en brøkdel af den tid, som serveren bruger på opbygning af html-koden (som jo altså også stort set altid vil være flere gange så stor som de rå data !-)
json (JavaScript Object Notation) er en måde at indlejre data i et objekt, som nemt kan aflæses fra javascript, f.eks.
Nu har jeg lige lynstuderet json mens jeg har siddet her og ventet på svar. Men jeg har ikke helt luret hvorfor objektet skal igennem eval() før det kan tages i brug?
For ud fra mine egne test kan man sagtens tilgå dataen direkte fra objektet?
---------------- <script type="text/javascript"> var data = { "navn" : "kim", "efter" : "larsen", "adresse" : { "vejnavn" : "roskildevej", "husnummer" : 12 }, "alder" : 9, "telefon" : [1234578, 87654321] } alert(data.telefon[0]); </script> ----------------- er hvad jeg har prøvet med.
Hvis man f.eks. skal sende din datastruktur som færdige tabellinjer vil du have selve html'en som overhead, og den vil ganske ofte komme til at fylde mange gange så meget ...
-- og hvis data sendes med i dokumentet, vil man kunne starte indsætningen af data, når dokumentet ellers er loadet færdigt, og så vise en meddelelse om dette på den ene eller anden måde, og så fjerne den som det sidste man gør i et script, der indsætter !-)
Mht. at klone en tabel er jeg ikke helt sikker på jeg forstår hvad du mener. Kan du forklare det hurtigt, eller give et link til det - vil jeg være taknemlig :-)
... var tpl = document.getElementById("template").getElementsBTagName("tr"); var target = document.getElementByID("herVisesTingene").getElementsByTagName("tbody"); var newNode, tds; ...
-- og i en løkke for hver række:
newNode = tpl.cloneNode(true); tds = newNode.getElementsByTagName("td"); for(i=0;9>i;i++){ //kun som eksempel, du skal med garanti lave det lidt anderledes tds[i].appendChild(document.createTextNode(data[i])); } target.appendChild(newNode);
... var tpl = document.getElementById("template").getElementsBTagName("tr")[0]; var target = document.getElementByID("herVisesTingene").getElementsByTagName("tbody")[0]; var newNode, tds; ...
Du skal også tænke på, at serveren er mange gange så lang tid om at udskrive HTML, som den er om at udskrive samme data i en JSON-streng, hvis vi f.eks. taler PHP ;o)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.