पुराना प्रश्न है, लेकिन चूंकि प्रश्न "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 है - आप के साथ document.querySelectorऔर वेनिला जावास्क्रिप्ट का उपयोग कर एक ही दृष्टिकोण लेने में सक्षम होना चाहिए .innerHTML।
jsfiddle
जेएस के अंदर टेम्पलेट
अपने आप से पूछने के लिए एक प्रश्न है: क्या आप वास्तव में HTML फ़ाइलों के रूप में टेम्पलेट्स को परिभाषित करना चाहते हैं / चाहते हैं? आप एक टेम्पलेट को हमेशा उसी तरह से पुन: उपयोग कर सकते हैं, जिस तरह से आप उन सभी चीजों का फिर से उपयोग करेंगे, जिन्हें आप दोहराना चाहते हैं: एक फ़ंक्शन के साथ।
Es7- भूमि में, विनाशकारी, टेम्पलेट स्ट्रिंग्स और एरो-फ़ंक्शंस का उपयोग करके, आप सीधे सुंदर दिखने वाले घटक फ़ंक्शंस लिख सकते हैं जिन्हें आसानी से $.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(''));
ओह और अंतिम नोट: यदि आप किसी DB से पढ़े गए हैं, या आपके पृष्ठ से HTML (और फिर स्क्रिप्ट आदि) चला सकते हैं, तो किसी टेम्पलेट को दिए गए अपने गुणों को स्पष्ट करना न भूलें।