[JS] innerHTML ou DOM ?

innerHTML ou DOM ? [JS] - HTML/CSS - Programmation

Marsh Posté le 09-04-2008 à 09:36:26    

[:zytra] Salut les progueux !
 
Je suis en train de bosser sur un petit projet perso dans lequel je voudrais générer automatiquement en JS du contenu HTML de ma page. C'est pas du AJAX ni rien de compliqué, c'est juste une génération automatique de listes et de liens à partir de données qui sont stockées dans un JSON externe.
 
Au début, j'avais commencé à coder tout ça avec du innerHTML, genre :

Code :
  1. var html = "<ul>";
  2. for (var i in data) {
  3.   html = html + "<li>" + data[i] + "</li>";
  4. }
  5. html = html + "</ul>";
  6. document.getElementById("mon_id" ).innerHTML = html;


 
Puis j'ai découvert que innerHTML n'était pas standard et qu'il valait mieux utiliser le DOM, alors j'ai tout réécrit comme ça:

Code :
  1. var ul = document.createElement('ul');
  2. for (var i in data) {
  3.   var li = document.createElement('li');
  4.   li.appendChild( document.createTextNode(data[i]));
  5.   ul.appendChild(li);
  6. }
  7. document.getElementById("mon_id" ).appendChild(ul);


 
Et puis j'ai continué de me renseigner et j'ai trouvé sur le net tout et son contraire : certains disent que innerHTML est plus efficace et mieux supporté en pratique, d'autres disent que la seule manière valide est d'utiliser le DOM qui est un standard. :??:
 
 
Finalement que me conseillez-vous ? Y a-t-il selon vous une meilleure manière de procéder ?
 
 
:jap: merci d'avance


---------------
TriScale innov
Reply

Marsh Posté le 09-04-2008 à 09:36:26   

Reply

Marsh Posté le 09-04-2008 à 13:42:02    

pour bosser depuis plus de 2 ans sur des gros projets (site ou applications ajax) je peux t'affirmer, qu'il n'y a rien de plus rapide que le innerHTML quand on doit généré quantité astronomique de contenu (genre une liste de 800 contacts).
 
Ensuite si tu dois juste générer 2/3 bricole, tu peux très bien utiliser le dom, ce qui te permettra de rajouter des methodes/Events sur les objets plus facilement.

Reply

Marsh Posté le 09-04-2008 à 14:01:37    

La plupart des frameworks utilisent DOM pour ce genre de fonctions mais innerHTML est bien plus rapide :jap: à voir selon les besoins donc


---------------
Feedback HAV
Reply

Marsh Posté le 09-04-2008 à 14:47:15    

OK.
 
:jap: Merci à vous deux. Je vais donc (au moins dans un premier temps) rester sur innerHTML.
 
Je jette aussi un coup d'oeil aux frameworks pour voir s'il y en a d'intéressants...


---------------
TriScale innov
Reply

Marsh Posté le 09-04-2008 à 15:01:37    

innerHTML est effectivement vachement plus rapide que DOM. Faut quand même faire gaffe avec l'injection de script (XSS), alors qu'avec DOM pas de problème pour transmettre n'importe quelle chaine à un createTextElement.
 
J'ai aussi ouïe dire qu'innerHTML sera enfin inclus dans les specs d'HTMLv5, donc à priori ça risque pas de passer en "deprecated" de sitôt.

Reply

Marsh Posté le 09-04-2008 à 16:01:46    

Et accessoirement dans ton exemple d'innerHTML le HTML est créé n'importe comment, ça va ramer :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 09-04-2008 à 16:27:03    

masklinn a écrit :

Et accessoirement dans ton exemple d'innerHTML le HTML est créé n'importe comment, ça va ramer :o

:sweat: ça m'étonne qu'à moitié : je suis loin d'être un expert JS.
 
Comment devrais-je faire ?


---------------
TriScale innov
Reply

Marsh Posté le 09-04-2008 à 16:32:21    

franceso a écrit :

:sweat: ça m'étonne qu'à moitié : je suis loin d'être un expert JS.
 
Comment devrais-je faire ?


Une liste concaténée avec join:
 

Code :
  1. var html = ["<ul>"];
  2. for(var item in data) {
  3.    html.push("<li>" );
  4.    html.push(data[item]);
  5.    html.push("</li>" );
  6. }
  7. html.push("</ul>" );
  8.  
  9. document.getElementById("mon_id" ).innerHTML = html.join("" );


Ca permettra de créer beaucoup moins de chaînes de caractères, donc de bouffer moins de mémoire et d'aller plus vite.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 09-04-2008 à 16:33:52    

le monsieur m'a grilled :o

Message cité 1 fois
Message édité par gatsu35 le 09-04-2008 à 16:37:54
Reply

Marsh Posté le 09-04-2008 à 16:35:30    

gatsu35 a écrit :

dans la boucle à chaque fois que tu fais

Code :
  1. html = html + "blabla"


tu récréé un instance String, ce qui est assez consommateur en perf. Le mieux est de push ta string dans un tableau, et au final tu join l'ensemble

 
Code :
  1. var html = ["<ul>"];
  2. for (var i in data) {
  3.   html.push("<li>" + data[i] + "</li>" );
  4. }
  5. html.push("</ul>" );
  6. document.getElementById("mon_id" ).innerHTML = html.join("" );



fail


Message édité par masklinn le 09-04-2008 à 16:35:38

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 09-04-2008 à 16:35:30   

Reply

Marsh Posté le 09-04-2008 à 16:39:44    

:jap: Je connaissais pas cette technique...
 
Je vais regarder ça.


---------------
TriScale innov
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed