Старе запитання, але оскільки в цьому питанні задається "використання jQuery", я подумав, що я б запропонував варіант, який дозволяє це робити, не вводячи жодної залежності від постачальника.
Незважаючи на те, що там є багато двигунів-шаблонів, багато їхніх функцій останнім часом припали до зневаги: ітерація ( <% for), conditionals ( <% if) та перетворення ( <%= 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 (а потім запустити сценарії тощо) зі своєї сторінки.