jQuery - les Meilleures Pratiques pour créer des complexes des Fragments de HTML
Est-il un général de meilleures pratiques pour la création de complexes d'éléments HTML en jQuery? J'ai essayé de plusieurs façons différentes.
J'ai d'abord essayé d'utiliser createElement et le chaînage de beaucoup de ceux avec AppendTo et la comme:
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 rude depuis appendTo veut ajouter à chaque élément correspondant donc tout ce qui a besoin de son propre nom, sinon il finit de s'ajouter à plusieurs reprises toute la place.
Puis j'ai essayé de créer un tableau et de joindre ensemble:
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, même si dans IE quand j'en ai mis un alert($(badgeFragment).texte()) il habituellement est venu de revenir à vide. (Cela faisait partie de débogage d'un problème plus vaste). Je suis évidemment un peu nouveau pour jQuery (Et même Javascript vraiment) donc, pour essayer et assurez-vous que ce n'était pas le problème, j'ai essayé une troisième méthode - le géant de la concaténation de chaîne:
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>';
Est l'une de ces méthodes généralement considérées comme meilleures que les autres? Je ne suis pas vraiment bon avec les différents profileurs donc je ne suis pas sûr de la façon de le vérifier moi-même. Il y a aussi la question de savoir si oui ou non l'ensemble de ces méthodes sont de la croix-navigateur compatible.
- Votre alerte IE est venu vide parce que ".text()" ne pas obtenir tout le contenu de votre sous-arbre DOM. Essayez $(badgeFragment).html()
Vous devez vous connecter pour publier un commentaire.
Avec jQuery 1.4, vous pouvez créer des éléments HTML comme ceci:
Voici un lien vers la documentation.
Je ne suis pas sûr que cette approche est plus rapide que d'utiliser le
html()
fonction de jQuery. Ou plus rapide que de sauter jQuery tous ensemble et utilisez lesinnerHTML
propriété sur un élément. Mais autant que la lisibilité va; jQuery approche est mon préféré. Et dans la plupart des cas, les performances de gain de l'aideinnerHTML
est marginal.The name "class" must be quoted in the object since it is a JavaScript reserved word
.'html': '<p><span>I am</span> <strong>nested</strong></p>'
Vous n'avez pas à appeler le document.createElement:
Il y a toutes sortes d'outils utiles dans jQuery pour étendre/ammending les DOM. Regardez les différentes "envelopper" les méthodes par exemple.
Une autre possibilité: pour vraiment gros blobs de nouveau contenu, vous pourriez être mieux d'avoir votre serveur à la préparation de ceux (à l'aide du côté serveur, le système de template, tout ce qui est pour vous) et de l'extraction de ceux avec
$.load()
ou une autre approche ajax.Je serais enclin à regarder l'un des moteurs de template jquery comme jQote
John Resig (créateur de jQuery) a proposé d'utiliser cette méthode de gabarits de retour en 2008. C'est en fait un assez cool caractéristiques:
puis de la récupérer à l'aide de...
Voir ici pour plus de détails:
http://ejohn.org/blog/javascript-micro-templating/
Personnellement, je pense que c'est plus important que le code soit lisible et modifiable que performant. Quel que soit celui que vous trouvez plus facile à regarder et à des modifications sans les casser devrait être celui que vous choisissez.
J'aime la création de modèles de langue Handlebars.js
C'est plus lisible et maintenable si le code JavaScript ressemble à de la balise HTML structure. Vous pouvez aller de l'officiel de l'itinéraire à l'aide de jQuery $('div', { 'class': 'etc'})...
Ici est une approche légèrement différente à l'aide d'une fonction de $$ pour faire de chaque élément éditable objet jQuery. Il devrait être assez rapide car il n'existe pas d'analyse html de prendre place.
Cela rend l'approche plus flexible et vous pouvez ajouter des gestionnaires d'événements, de données, etc. à la imbriquée jQuery objets à l'aide de chaînage assez facilement par exemple
Le code est plus lisible que si l'on devait utiliser la langue officielle de jQuery approche de le faire avec des appels distincts à .append(), .text ().html (), etc. ou par l'injection du jQuery $ a concaténé chaîne HTML.
De référence de la fonction $$:
Depuis HTML5, il y a la
<template>
tag.JS:
HTML:
La façon dont je suis en train de faire est montré ci-dessous. Je ne suis pas sûr si u devrait créer de nombreuses divs mais il a plutôt bien fonctionné avec moi.
Acclamations,
display:none;
conteneur pour ma éléments du modèle, les récupérer dans des variables javascript en utilisant soit getElementById() jQuery, le clone, puis de gérer les données de remplissage de moi.textContent=val/.texte(val), .setAttribute(attr,val)/.attr(attr,val)), car il est plus facile de le faire moi-même que de vous inquiéter de savoir si certains de pacotille de template library va faire son travail correctement et beaucoup plus performant parce que je sais exactement ce que je veux faire avec le modèle.