Ancienne question, mais puisque la question demande "en utilisant jQuery", j'ai pensé fournir une option qui vous permet de faire cela sans introduire de dépendance au fournisseur.
Bien qu'il existe de nombreux moteurs de création de modèles, nombre de leurs fonctionnalités ont récemment été défavorisées, avec l'itération ( <% for
), les conditions ( <% if
) et les transformations (<%= myString | uppercase %>
) considérées au mieux comme du microlangage, et au pire des anti-modèles. Les pratiques de création de modèles modernes encouragent simplement le mappage d'un objet à sa représentation DOM (ou autre), par exemple ce que nous voyons avec les propriétés mappées aux composants dans ReactJS (en particulier les composants sans état).
Modèles dans HTML
Une propriété sur laquelle vous pouvez compter pour conserver le HTML de votre modèle à côté du reste de votre HTML consiste à utiliser un fichier non exécutable <script>
type
, par exemple <script type="text/template">
. Pour votre cas:
<script type="text/template" data-template="listitem">
<a href="${url}" class="list-group-item">
<table>
<tr>
<td><img src="${img}"></td>
<td><p class="list-group-item-text">${title}</p></td>
</tr>
</table>
</a>
</script>
Lors du chargement du document, lisez votre modèle et jetez-le en utilisant un simple String#split
var itemTpl = $('script[data-template="listitem"]').text().split(/\$\{(.+?)\}/g);
Notez qu'avec notre token, vous l'obtenez au [text, property, text, property]
format alterné . Cela nous permet de le mapper joliment en utilisant un Array#map
, avec une fonction de mappage:
function render(props) {
return function(tok, i) { return (i % 2) ? props[tok] : tok; };
}
Où props
pourrait ressembler { url: 'http://foo.com', img: '/images/bar.png', title: 'Lorem Ipsum' }
.
En supposant que vous avez analysé et chargé votre itemTpl
comme ci-dessus, et que vous avez un items
tableau dans la portée:
$('.search').keyup(function () {
$('.list-items').append(items.map(function (item) {
return itemTpl.map(render(item)).join('');
}));
});
Cette approche est également à peine jQuery - vous devriez être en mesure d'adopter la même approche en utilisant javascript vanilla avec document.querySelector
et .innerHTML
.
jsfiddle
Modèles dans JS
Une question à vous poser est: voulez-vous vraiment / avez-vous vraiment besoin de définir des modèles comme des fichiers HTML? Vous pouvez toujours composant + réutiliser un modèle de la même manière que vous réutiliseriez la plupart des choses que vous souhaitez répéter: avec une fonction.
Dans es7-land, en utilisant la déstructuration, les chaînes de modèle et les fonctions fléchées, vous pouvez écrire de jolies fonctions de composant qui peuvent être facilement chargées en utilisant la $.fn.html
méthode ci-dessus.
const Item = ({ url, img, title }) => `
<a href="${url}" class="list-group-item">
<div class="image">
<img src="${img}" />
</div>
<p class="list-group-item-text">${title}</p>
</a>
`;
Ensuite, vous pouvez facilement le rendre, même mappé à partir d'un tableau, comme ceci:
$('.list-items').html([
{ url: '/foo', img: 'foo.png', title: 'Foo item' },
{ url: '/bar', img: 'bar.png', title: 'Bar item' },
].map(Item).join(''));
Oh et note finale: n'oubliez pas de nettoyer vos propriétés passées à un modèle, si elles sont lues à partir d'une base de données, ou quelqu'un pourrait passer du HTML (puis exécuter des scripts, etc.) depuis votre page.