Eski soru, ancak soru "jQuery kullanarak" diye sorduğundan, bunu herhangi bir satıcı bağımlılığı getirmeden yapmanıza izin veren bir seçenek sunacağımı düşündüm.
Piyasada çok sayıda şablon oluşturma motoru varken, özelliklerinin çoğu, en iyi durumda mikro dil olarak görülen iterasyon ( <% for
), koşullu ifadeler ( <% if
) ve dönüşümler ( <%= myString | uppercase %>
) ve en kötü ihtimalle anti-kalıplar ile son zamanlarda gözden düşmeye başladı. Modern şablon oluşturma uygulamaları, bir nesneyi DOM (veya diğer) temsiliyle, örneğin ReactJS'deki bileşenlerle eşlenen özelliklerle (özellikle durumsuz bileşenler) gördüğümüzle eşlemeyi teşvik eder.
HTML İçindeki Şablonlar
Şablonunuzun HTML'sini HTML'nizin geri kalanının yanında tutmak için güvenebileceğiniz bir özellik, yürütülemeyen kullanmaktır <script>
type
, ör <script type="text/template">
. Davanız için:
<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>
Belge yüklenirken şablonunuzu okuyun ve basit bir String#split
var itemTpl = $('script[data-template="listitem"]').text().split(/\$\{(.+?)\}/g);
Jetonumuzla, onu alternatif [text, property, text, property]
biçimde aldığınıza dikkat edin . Bu Array#map
, onu bir eşleme işlevi ile bir kullanarak güzel bir şekilde eşlememizi sağlar:
function render(props) {
return function(tok, i) { return (i % 2) ? props[tok] : tok; };
}
Nereye props
benzeyebilir { url: 'http://foo.com', img: '/images/bar.png', title: 'Lorem Ipsum' }
.
itemTpl
Yukarıdaki gibi ayrıştırıp yüklediğinizi ve items
kapsam dahilinde bir diziniz olduğunu varsayarak hepsini bir araya getirirsek :
$('.search').keyup(function () {
$('.list-items').append(items.map(function (item) {
return itemTpl.map(render(item)).join('');
}));
});
Bu yaklaşım aynı zamanda sadece neredeyse hiç jQuery - aynı yaklaşımı vanilya javascript'i document.querySelector
ve ile birlikte kullanabilmelisiniz .innerHTML
.
jsfiddle
JS içindeki şablonlar
Kendinize sormanız gereken bir soru şudur: Şablonları HTML dosyaları olarak tanımlamak gerçekten istiyor musunuz / buna ihtiyacınız var mı? Bir şablonu her zaman, tekrarlamak istediğiniz çoğu şeyi yeniden kullandığınız şekilde bileşenleştirebilir + yeniden kullanabilirsiniz: bir işlevle.
Es7-land'de, yıkım, şablon dizgileri ve ok işlevlerini kullanarak, $.fn.html
yukarıdaki yöntemi kullanarak kolayca yüklenebilen düpedüz güzel görünümlü bileşen işlevleri yazabilirsiniz .
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>
`;
Ardından, bir diziden eşlenmiş olsa bile, şöyle kolayca oluşturabilirsiniz:
$('.list-items').html([
{ url: '/foo', img: 'foo.png', title: 'Foo item' },
{ url: '/bar', img: 'bar.png', title: 'Bar item' },
].map(Item).join(''));
Oh ve son not: Bir şablona aktarılan özelliklerinizi, eğer bir veritabanından okunuyorlarsa, ya da birisi sayfanızdan HTML'de geçebilirse (ve sonra komut dosyalarını çalıştırabilir, vb.) Temizlemeyi unutmayın.