Stare pytanie, ale ponieważ pytanie dotyczy „używania jQuery”, pomyślałem, że udostępnię opcję, która pozwoli ci to zrobić bez wprowadzania zależności od dostawcy.
Chociaż istnieje wiele silników tworzących szablony , wiele z ich funkcji zostało ostatnio zniechęconych, a iteracja ( <% for), warunki warunkowe ( <% if) i transformacje ( <%= myString | uppercase %>) są postrzegane w najlepszym przypadku jako mikroling, a w najgorszym - anty-wzorce. Nowoczesne praktyki tworzenia szablonów zachęcają do prostego mapowania obiektu na jego reprezentację DOM (lub inną), np. To, co widzimy z właściwościami odwzorowanymi na komponenty w ReactJS (zwłaszcza komponenty bezstanowe).
Szablony wewnątrz HTML
Jedną z właściwości, na której możesz polegać, aby zachować kod HTML swojego szablonu obok reszty kodu HTML, jest użycie niewykonującego się kodu <script> type, np <script type="text/template">. W Twoim przypadku:
<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>
Podczas ładowania dokumentu przeczytaj swój szablon i stokenizuj go za pomocą prostego pliku String#split
var itemTpl = $('script[data-template="listitem"]').text().split(/\$\{(.+?)\}/g);
Zauważ, że z naszym tokenem otrzymujesz go w naprzemiennym [text, property, text, property]formacie. To pozwala nam ładnie zmapować go za pomocą Array#map, z funkcją mapowania:
function render(props) {
return function(tok, i) { return (i % 2) ? props[tok] : tok; };
}
Gdzie propsmogłoby wyglądać { url: 'http://foo.com', img: '/images/bar.png', title: 'Lorem Ipsum' }.
Składając to wszystko razem, zakładając, że przeanalizowałeś i załadowałeś swój itemTpljak powyżej i masz itemstablicę w zakresie:
$('.search').keyup(function () {
$('.list-items').append(items.map(function (item) {
return itemTpl.map(render(item)).join('');
}));
});
To podejście jest tylko ledwie jQuery - powinieneś być w stanie zastosować to samo podejście, używając zwykłego javascript z document.querySelectori .innerHTML.
jsfiddle
Szablony wewnątrz JS
Pytanie, które należy sobie zadać, brzmi: czy naprawdę chcesz / musisz definiować szablony jako pliki HTML? Zawsze możesz skomponować + ponownie użyć szablonu w taki sam sposób, w jaki używałbyś większości rzeczy, które chcesz powtórzyć: za pomocą funkcji.
W es7-land, używając destrukturyzacji, ciągów szablonów i funkcji strzałek, możesz napisać całkiem ładnie wyglądające funkcje składowe, które można łatwo załadować za pomocą $.fn.htmlpowyższej metody.
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>
`;
Wtedy możesz go łatwo wyrenderować, nawet zmapowany z tablicy, na przykład:
$('.list-items').html([
{ url: '/foo', img: 'foo.png', title: 'Foo item' },
{ url: '/bar', img: 'bar.png', title: 'Bar item' },
].map(Item).join(''));
Aha i ostatnia uwaga: nie zapomnij oczyścić swoich właściwości przekazanych do szablonu, jeśli są odczytywane z bazy danych lub ktoś może przekazać HTML (a następnie uruchomić skrypty itp.) Ze strony.