คำถามเก่า แต่เนื่องจากคำถามถามว่า "ใช้ jQuery" ฉันคิดว่าฉันจะมีตัวเลือกที่ช่วยให้คุณทำสิ่งนี้ได้โดยไม่ต้องพึ่งพาผู้ขายใด ๆ
ในขณะที่มีเครื่องมือสร้างเทมเพลตจำนวนมากอยู่ที่นั่นคุณลักษณะหลายอย่างของพวกเขาได้ตกอยู่ในความไม่พึงประสงค์เมื่อเร็ว ๆ นี้ด้วยการวนซ้ำ ( <% for
) เงื่อนไข ( <% 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 (แล้วเรียกใช้สคริปต์ ฯลฯ ) จากหน้าของคุณ