Старый вопрос, но поскольку вопрос спрашивает «с использованием jQuery», я подумал, что предоставлю вариант, который позволит вам сделать это, не вводя зависимости от поставщика.
Хотя существует множество движков шаблонов, многие из их функций в последнее время перестали пользоваться популярностью, при этом iteration ( <% for
), conditionals ( <% if
) и transforms ( <%= myString | uppercase %>
) рассматриваются в лучшем случае как микроязык, а в худшем - как анти-шаблоны. Современные методы создания шаблонов поощряют простое отображение объекта в его представление DOM (или другое), например, то, что мы видим со свойствами, сопоставленными с компонентами в ReactJS (особенно с компонентами без состояния).
Шаблоны внутри HTML
Одно свойство, на которое вы можете положиться для сохранения HTML-кода вашего шаблона рядом с остальной частью вашего HTML, - это использование неисполняемого <script>
type
, например <script type="text/template">
. Для вашего случая:
<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>
При загрузке документа прочтите свой шаблон и токенизируйте его, используя простой String#split
var itemTpl = $('script[data-template="listitem"]').text().split(/\$\{(.+?)\}/g);
Обратите внимание, что с нашим токеном вы получаете его в альтернативном [text, property, text, property]
формате. Это позволяет нам красиво отображать его Array#map
с помощью функции сопоставления:
function render(props) {
return function(tok, i) { return (i % 2) ? props[tok] : tok; };
}
Куда props
могло быть похоже { url: 'http://foo.com', img: '/images/bar.png', title: 'Lorem Ipsum' }
.
Собираем все вместе, предполагая, что вы проанализировали и загрузили свой, itemTpl
как указано выше, и у вас есть items
массив в области видимости:
$('.search').keyup(function () {
$('.list-items').append(items.map(function (item) {
return itemTpl.map(render(item)).join('');
}));
});
Этот подход также едва ли соответствует jQuery - вы должны иметь возможность использовать тот же подход, используя ванильный javascript с document.querySelector
и .innerHTML
.
jsfiddle
Шаблоны внутри JS
Задайте себе вопрос: действительно ли вам нужно / нужно определять шаблоны как файлы HTML? Вы всегда можете разбить на компоненты + повторно использовать шаблон так же, как вы бы повторно использовали большинство вещей, которые хотите повторить: с функцией.
В es7-land, используя деструктуризацию, строки шаблонов и стрелочные функции, вы можете написать совершенно красивые функции компонентов, которые можно легко загрузить с помощью $.fn.html
описанного выше метода.
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>
`;
Тогда вы могли бы легко отобразить его, даже если он был отображен из массива, например:
$('.list-items').html([
{ url: '/foo', img: 'foo.png', title: 'Foo item' },
{ url: '/bar', img: 'bar.png', title: 'Bar item' },
].map(Item).join(''));
Ну и последнее замечание: не забудьте очистить свои свойства, переданные в шаблон, если они читаются из БД или кто-то может передать HTML (а затем запустить сценарии и т. Д.) С вашей страницы.