Construction HTML (~= DOM) à l'aide de jQuery
J'ai peut-être fait quelque chose de mal, mais je n'ai pas été en mesure de trouver une bonne façon de construire de base HTML/DOM structures, comme des listes, de manière dynamique. Exemple Simple serait de construire un tableau (élément de tableau, d'une ligne de cellules, avec des échappées de contenu de texte) donnée d'entrée comme json (objets).
Le problème que j'ai, c'est que la plupart des appels (comme ".append()", ".html()", ".text()") ne semblent pas à la chaîne de l'intuition (pour moi, de toute façon) façon. Par exemple, vous ne peut pas faire quelque chose comme:
$("#divId").append("<table>").append("<tr>").append("<td>").text("some text");
texte() appel semble effacer le contenu au niveau principal; et ajoute également ajouter des trucs dans le même champ d'application. Je m'attends à ce appennd() pour renvoyer le contenu ajouté, mais il semble être de retour à son propre contexte.
Je sais qu'il est simple "appendText()" extension de l'aide avec la dernière partie. Mais et les autres?
Pour ce que ça vaut, je retourne à DOM, quelque chose comme
$("#divId")[0].appendChild(document.createElement("table"))....
mais c'est assez verbeux.
Donc j'espère que je suis absent quelque chose de tout à fait évident... mais quoi? Appel autre que append()?
J'ai essayé de navigation jQuery référence docs, googler, mais la plupart des docs suffit d'utiliser "intégrer tous les trucs dans une chaîne de caractères"; qui a des problèmes, y compris celui de ne pas citer le contenu textuel correctement.
(aussi: non, ce n'est pas une dup de "JQuery: Construire le code HTML dans la "mémoire" plutôt que DOM"
Vous devez vous connecter pour publier un commentaire.
Vous pouvez faire ceci:
comme:
ou
$("<li>"+i+"</li>")
va analyser et de créer un nouveau dom chaque boucle (Mauvais rendement)$("<li/>").test(i)
cache le li l'objet et de modifier le texte de chaque boucle. Rapide mais encore une fois pas dynamique comme il changer le texte sur l'original en cache li. si votre dans une boucle for par exemple, vous aurez besoin de faire un clone():$("<li/>").clone().text(i)
"some text"
est stocké dans une variable. C'est la première mauvaise solution que j'ai trouver sur LE!"some text"
, il fait exactement la même chose, ce que l'auteur de la question considère comme contraire à l'intuition ("text() appel semble effacer le contenu au niveau principal; et ajoute également ajouter des trucs dans le même champ d'application."). Et parce que mon montage a été rejeté, je suis l'affichage correct (à mon humble avis) version:$("#divId").append($("<table>").append($("<tr>").text("some text")))
- cette version a été publiée également dans ce thread ci-dessous;Vous pouvez utiliser
append
:Si vraiment vous insistez, vous pouvez utiliser
appendTo
, mais c'est moins intuitif, sera plus lente et prend un peu plus de frappes:Dans tous les cas, il est important d'utiliser
.text("...")
à échapper les caractères spéciaux (et éviter les attaques XSS).Encore mieux, quand vous vous ennuyez avec les écrit ces, vous voulez vraiment regarder dans
jsrender
, moustache, guidon, doT ou tout autre des nombreux javascript templating des solutions. Il vous permet de garder votre code distinct de votre code HTML (pensez MVC) et le rend beaucoup plus claire de ce que vous construisez. Il est beaucoup plus facile à modifier trop.Rapide remarque: en outre, AppendDOM plugin ressemble peut également simplifier la tâche.
Vous pouvez également utiliser le jQuery createHtml plugin qui permet de le faire:
Il est un peu plus pratique que le .append() de la chaîne que vous pouvez mettre du contenu html et les attributs dans les éléments que vous leur string le long de: