Alte Frage, aber da die Frage "using jQuery" lautet, dachte ich, ich würde eine Option bereitstellen, mit der Sie dies tun können, ohne eine Herstellerabhängigkeit einzuführen.
Zwar gibt es eine Vielzahl von Template-Engines, doch viele ihrer Funktionen haben sich in letzter Zeit als ungünstig erwiesen , wobei Iteration ( <% for
), Bedingungen ( <% if
) und Transformationen ( <%= myString | uppercase %>
) bestenfalls als Mikrosprache und im schlimmsten Fall als Anti-Patterns angesehen werden. Moderne Vorlagenpraktiken empfehlen, ein Objekt einfach seiner DOM-Darstellung (oder einer anderen Darstellung) zuzuordnen, z. B. dem, was wir mit Eigenschaften sehen, die Komponenten in ReactJS zugeordnet sind (insbesondere zustandslose Komponenten).
Vorlagen in HTML
Eine Eigenschaft, auf die Sie sich verlassen können, um den HTML-Code für Ihre Vorlage neben dem Rest Ihres HTML-Codes zu halten, ist die Verwendung eines nicht ausgeführten <script>
type
, z <script type="text/template">
. Für Ihren Fall:
<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>
Lesen Sie beim Laden des Dokuments Ihre Vorlage und markieren Sie sie mit einem einfachen Token String#split
var itemTpl = $('script[data-template="listitem"]').text().split(/\$\{(.+?)\}/g);
Beachten Sie, dass Sie unser Token im alternierenden [text, property, text, property]
Format erhalten. Auf diese Weise können wir es Array#map
mit einer Mapping-Funktion gut abbilden:
function render(props) {
return function(tok, i) { return (i % 2) ? props[tok] : tok; };
}
Wo props
könnte so aussehen { url: 'http://foo.com', img: '/images/bar.png', title: 'Lorem Ipsum' }
.
Alles zusammen, vorausgesetzt, Sie haben Ihre Daten itemTpl
wie oben beschrieben analysiert und geladen und haben ein items
Array im Gültigkeitsbereich:
$('.search').keyup(function () {
$('.list-items').append(items.map(function (item) {
return itemTpl.map(render(item)).join('');
}));
});
Dieser Ansatz ist auch nur knapp jQuery - Sie sollten in der Lage sein, den gleichen Ansatz mit Vanille-Javascript mit document.querySelector
und zu verfolgen .innerHTML
.
jsfiddle
Vorlagen in JS
Eine Frage, die Sie sich stellen sollten, lautet: Möchten / müssen Sie Vorlagen wirklich als HTML-Dateien definieren? Sie können eine Vorlage jederzeit so komponieren und wiederverwenden, wie Sie die meisten Dinge, die Sie wiederholen möchten, wiederverwenden würden: mit einer Funktion.
In es7-land können Sie mithilfe von Destrukturierung, Vorlagenzeichenfolgen und Pfeilfunktionen geradezu hübsch aussehende Komponentenfunktionen schreiben, die mit der $.fn.html
obigen Methode einfach geladen werden können .
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>
`;
Dann können Sie es einfach rendern, sogar aus einem Array, wie folgt:
$('.list-items').html([
{ url: '/foo', img: 'foo.png', title: 'Foo item' },
{ url: '/bar', img: 'bar.png', title: 'Bar item' },
].map(Item).join(''));
Oh und letzter Hinweis: Vergessen Sie nicht, Ihre an eine Vorlage übergebenen Eigenschaften zu bereinigen, wenn sie aus einer Datenbank gelesen wurden oder jemand HTML von Ihrer Seite übergeben (und dann Skripte usw. ausführen) könnte.