Pertanyaan lama, tetapi karena pertanyaannya menanyakan "menggunakan jQuery", saya pikir saya akan memberikan opsi yang memungkinkan Anda melakukan ini tanpa memperkenalkan ketergantungan vendor.
Meskipun ada banyak mesin template di luar sana, banyak dari fitur mereka tidak disukai baru-baru ini, dengan iteration ( <% for
), conditionals ( <% if
) dan transforms ( <%= myString | uppercase %>
) dilihat sebagai bahasa mikro paling baik, dan anti-pola paling buruk. Praktik pembuatan template modern mendorong hanya memetakan objek ke representasi DOM (atau lainnya), misalnya apa yang kita lihat dengan properti yang dipetakan ke komponen di ReactJS (terutama komponen stateless).
Template Di Dalam HTML
Satu properti yang dapat Anda andalkan untuk menyimpan HTML untuk template Anda di samping HTML Anda lainnya, adalah dengan menggunakan non-executing <script>
type
, mis <script type="text/template">
. Untuk kasus Anda:
<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>
Saat dokumen dimuat, baca template Anda dan beri tokenize menggunakan sederhana String#split
var itemTpl = $('script[data-template="listitem"]').text().split(/\$\{(.+?)\}/g);
Perhatikan bahwa dengan token kami, Anda mendapatkannya dalam [text, property, text, property]
format bergantian . Ini memungkinkan kita memetakannya dengan baik menggunakan Array#map
, dengan fungsi pemetaan:
function render(props) {
return function(tok, i) { return (i % 2) ? props[tok] : tok; };
}
Dimana props
bisa terlihat seperti { url: 'http://foo.com', img: '/images/bar.png', title: 'Lorem Ipsum' }
.
Menyatukan semuanya dengan asumsi Anda telah mem-parsing dan memuat Anda itemTpl
seperti di atas, dan Anda memiliki items
array dalam lingkup:
$('.search').keyup(function () {
$('.list-items').append(items.map(function (item) {
return itemTpl.map(render(item)).join('');
}));
});
Pendekatan ini juga hanya sedikit jQuery - Anda harus dapat mengambil pendekatan yang sama menggunakan vanilla javascript dengan document.querySelector
dan .innerHTML
.
jsfiddle.dll
Template di dalam JS
Sebuah pertanyaan untuk ditanyakan pada diri sendiri adalah: apakah Anda benar-benar ingin / perlu mendefinisikan template sebagai file HTML? Anda selalu dapat membuat komponen + menggunakan kembali template dengan cara yang sama seperti Anda menggunakan kembali sebagian besar hal yang ingin Anda ulangi: dengan sebuah fungsi.
Di es7-land, menggunakan destructuring, template strings, dan arrow-functions, Anda dapat menuliskan fungsi komponen yang tampak cantik yang dapat dengan mudah dimuat menggunakan $.fn.html
metode di atas.
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>
`;
Kemudian Anda dapat dengan mudah merendernya, bahkan dipetakan dari array, seperti ini:
$('.list-items').html([
{ url: '/foo', img: 'foo.png', title: 'Foo item' },
{ url: '/bar', img: 'bar.png', title: 'Bar item' },
].map(Item).join(''));
Oh dan catatan terakhir: jangan lupa untuk membersihkan properti Anda yang diteruskan ke template, jika mereka dibaca dari DB, atau seseorang dapat mengirimkan HTML (dan kemudian menjalankan skrip, dll.) Dari halaman Anda.