Câu hỏi cũ, nhưng vì câu hỏi yêu cầu "sử dụng jQuery", tôi nghĩ tôi sẽ cung cấp một tùy chọn cho phép bạn thực hiện việc này mà không cần giới thiệu bất kỳ sự phụ thuộc vào nhà cung cấp nào.
Mặc dù có rất nhiều công cụ tạo khuôn mẫu trên mạng, nhưng nhiều tính năng của chúng đã bị đánh giá thấp gần đây, với phép lặp ( <% for
), điều kiện ( <% if
) và biến đổi ( <%= myString | uppercase %>
) được coi là microlanguage tốt nhất và tệ nhất là anti-pattern. Các phương pháp tạo khuôn mẫu hiện đại khuyến khích chỉ cần ánh xạ một đối tượng tới biểu diễn DOM (hoặc khác) của nó, ví dụ như những gì chúng ta thấy với các thuộc tính được ánh xạ tới các thành phần trong ReactJS (đặc biệt là các thành phần không trạng thái).
Mẫu bên trong HTML
Một tài sản mà bạn có thể dựa vào đó để giữ HTML cho mẫu của bạn bên cạnh còn lại của HTML của bạn, là bằng cách sử dụng một tổ chức phi thực hiện <script>
type
, ví dụ <script type="text/template">
. Đối với trường hợp của bạn:
<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>
Khi tải tài liệu, hãy đọc mẫu của bạn và mã hóa nó bằng cách sử dụng String#split
var itemTpl = $('script[data-template="listitem"]').text().split(/\$\{(.+?)\}/g);
Lưu ý rằng với mã thông báo của chúng tôi, bạn nhận được nó ở [text, property, text, property]
định dạng thay thế . Điều này cho phép chúng tôi lập bản đồ độc đáo bằng cách sử dụng một Array#map
chức năng ánh xạ:
function render(props) {
return function(tok, i) { return (i % 2) ? props[tok] : tok; };
}
Nơi props
có thể trông giống như { url: 'http://foo.com', img: '/images/bar.png', title: 'Lorem Ipsum' }
.
Tập hợp tất cả lại với nhau giả sử bạn đã phân tích cú pháp và tải của mình itemTpl
như trên và bạn có một items
mảng trong phạm vi:
$('.search').keyup(function () {
$('.list-items').append(items.map(function (item) {
return itemTpl.map(render(item)).join('');
}));
});
Cách tiếp cận này cũng chỉ là jQuery - bạn sẽ có thể thực hiện cách tiếp cận tương tự bằng cách sử dụng vanilla javascript với document.querySelector
và .innerHTML
.
jsfiddle
Các mẫu bên trong JS
Một câu hỏi tự hỏi bản thân là: bạn có thực sự muốn / cần xác định các mẫu dưới dạng tệp HTML không? Bạn luôn có thể cấu phần hóa + sử dụng lại một mẫu giống như cách bạn sử dụng lại hầu hết những thứ bạn muốn lặp lại: với một hàm.
Trong es7-land, bằng cách sử dụng hàm hủy, chuỗi mẫu và hàm mũi tên, bạn có thể viết các hàm thành phần trông rất đẹp và có thể dễ dàng tải bằng $.fn.html
phương pháp trên.
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>
`;
Sau đó, bạn có thể dễ dàng kết xuất nó, thậm chí được ánh xạ từ một mảng, như vậy:
$('.list-items').html([
{ url: '/foo', img: 'foo.png', title: 'Foo item' },
{ url: '/bar', img: 'bar.png', title: 'Bar item' },
].map(Item).join(''));
Và lưu ý cuối cùng: đừng quên làm sạch các thuộc tính của bạn được chuyển đến một mẫu, nếu chúng được đọc từ DB hoặc ai đó có thể chuyển vào HTML (và sau đó chạy các tập lệnh, v.v.) từ trang của bạn.