Existe-t-il une meilleure pratique générale pour créer des éléments HTML quelque peu complexes dans jQuery ? J'ai essayé plusieurs méthodes différentes.
J'ai d'abord essayé d'utiliser createElement et d'enchaîner plusieurs de ces éléments avec AppendTo et autres :
var badge = $(document.createElement("div")).attr("class", "wrapper1").appendTo("body");
$(document.createElement("div")).attr("class", "wrapper2").appendTo(".wrapper1");
$(document.createElement("table")).attr("class", "badgeBody").appendTo(".wrapper2");
$(document.createElement("tr")).attr("class", "row1").appendTo(".badgeBody");
$(document.createElement("td")).appendTo(".row1");
$(document.createElement("span")).attr("class", "badgeUnlocked").text("UNLOCKED! ").appendTo("td");
$(document.createElement("td")).attr("class", "badgeTitleText").appendTo(".row1");
$(document.createElement("span")).attr("class", "badgeTitle").text(name).appendTo(".badgeTitleText");
$(document.createElement("tr")).attr("class", "row2").appendTo(".badgeBody");
$(document.createElement("td")).appendTo(".row2");
$(document.createElement("img")).attr("src", imgUrl).appendTo(".row2 td");
$(document.createElement("td")).attr("class", "badgeText").appendTo(".row2");
$(document.createElement("span")).attr("class", "badgeDescription").text(description).appendTo(".badgeText");
Cela peut être difficile car appendTo veut ajouter à chaque élément correspondant, donc chaque élément doit avoir son propre nom, sinon il finira par être ajouté de manière répétée partout.
J'ai ensuite essayé de créer un tableau et de le joindre :
var badgeFragment = [
'<div><div id="'+ closeId+'" class="closeTab">X</div>',
'<div id="'+ badgeId+'" class="wrapper1">',
'<div class="wrapper2">',
'<div class="badgeBody">',
'<div class="badgeImage">',
'<img src="'+ imgUrl +'">',
'</div>',
'<div class="badgeContents">',
'<div class="badgeUnlocked">ACHIEVEMENT UNLOCKED: </div>',
'<div class="badgeTitle">'+ name +'</div>',
'<div id="'+ textId+'" class="badgeDescription">'+ description +'</div>',
'</div>',
'<div style="clear:both"></div>',
'</div></div></div></div></div>',
]
badgeFragment = $(badgeFragment.join(''));
Cela semble fonctionner assez bien, bien que dans IE, lorsque je mettais un alert($(badgeFragment).text()), il revenait généralement vide. (Cela faisait partie du débogage d'un problème plus important). Je suis évidemment un peu novice en matière de jQuery (et même de Javascript en fait), alors pour m'assurer que ce n'était pas le problème, j'ai essayé une troisième méthode : la concaténation géante de chaînes de caractères :
var badgeFragment =
'<div><div id="'+ closeId+'" class="closeTab">X</div>' +
'<div id="'+ badgeId+'" class="wrapper1">' +
'<div class="wrapper2">' +
'<div class="badgeBody">' +
'<div class="badgeImage">' +
'<img src="C:/Users/Ryan/Documents/icons/crystal_project/64x64/apps/chat.png">' +
'</div>' +
'<div class="badgeContents">' +
'<div class="badgeUnlocked">ACHIEVEMENT UNLOCKED: </div>' +
'<div class="badgeTitle">test</div>' +
'<div id="'+ textId+'" class="badgeDescription">test</div>' +
'</div>' +
'<div style="clear:both"></div>' +
'</div></div></div></div></div>';
L'une de ces méthodes est-elle généralement considérée comme meilleure que les autres ? Je ne suis pas très doué avec les différents profileurs, donc je ne sais pas comment le vérifier moi-même. Il y a aussi la question de savoir si toutes ces méthodes sont compatibles avec les différents navigateurs.
0 votes
Votre alerte dans IE est vide parce que ".text()" ne récupère pas tout le contenu de votre sous-arbre DOM. Essayez $(badgeFragment).html()