পুরানো প্রশ্ন, তবে যেহেতু প্রশ্নটি "jQuery ব্যবহার করে" জিজ্ঞাসা করে, তাই আমি ভেবেছিলাম যে আমি কোনও বিকল্প সরবরাহ করব যা আপনাকে কোনও বিক্রেতার নির্ভরতা না পরিচয় করেই এটি করতে দেয়।
সেখানে প্রচুর টেম্প্লেটিং ইঞ্জিনগুলি থাকা অবস্থায়, তাদের অনেকগুলি বৈশিষ্ট্য সম্প্রতি পুনরায় পুনরূদ্ধারে পড়েছে, পুনরাবৃত্তি ( <% for
), শর্তসাপেক্ষে ( <% if
) এবং রূপান্তরগুলি (<%= myString | uppercase %>
) সেরাকে মাইক্রোল্যাংয়েজ হিসাবে দেখা যায় এবং সবচেয়ে খারাপ সময়ে অ্যান্টি-নিদর্শনগুলির সাথে ছড়িয়ে পড়ে। আধুনিক টেম্প্লেটিং অনুশীলনগুলি কেবল কোনও আইটেমকে তার ডিওএম (বা অন্যান্য) উপস্থাপনে ম্যাপিং করতে উত্সাহ দেয়, উদাহরণস্বরূপ যা আমরা রিঅ্যাক্টজেএস (বিশেষত স্টেটলেস উপাদান) এর উপাদানগুলিতে ম্যাপযুক্ত বৈশিষ্ট্যগুলির সাথে দেখি।
এইচটিএমএলের অভ্যন্তরে টেম্পলেটগুলি
আপনার টেমপ্লেটের জন্য এইচটিএমএলকে আপনার বাকী এইচটিএমএলের পাশে রাখার জন্য যে সম্পত্তির উপর আপনি নির্ভর করতে পারেন তার একটি হ'ল অ-এক্সিকিউটিভ ব্যবহার করে <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
জেএস ভিতরে টেমপ্লেট
নিজেকে জিজ্ঞাসা করার একটি প্রশ্ন হ'ল আপনি কি সত্যিই টেমপ্লেটগুলি এইচটিএমএল ফাইল হিসাবে সংজ্ঞায়িত করতে চান / প্রয়োজন? আপনি সর্বদা + টেম্পলেটটিকে একইভাবে সংযুক্ত করতে পারেন আপনি যে জাতীয় জিনিস পুনরাবৃত্তি করতে চান তা একইভাবে পুনরায় ব্যবহার করতে পারেন: একটি ফাংশন সহ।
এসআই-ল্যান্ডে, ডেস্ট্রাকচারিং, টেম্পলেট স্ট্রিং এবং অ্যারো-ফাংশন ব্যবহার করে আপনি $.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>
`;
তারপরে আপনি সহজেই এটিকে রেন্ডার করতে পারেন, এমনকি কোনও অ্যারে থেকে ম্যাপ করাও so
$('.list-items').html([
{ url: '/foo', img: 'foo.png', title: 'Foo item' },
{ url: '/bar', img: 'bar.png', title: 'Bar item' },
].map(Item).join(''));
ওহ এবং চূড়ান্ত দ্রষ্টব্য: আপনার সম্পত্তিগুলি কোনও ডিবি থেকে পড়লে, বা কেউ আপনার পৃষ্ঠা থেকে এইচটিএমএলে (এবং তারপরে স্ক্রিপ্টগুলি চালাতে পারে) পাস করতে পারলে আপনার বৈশিষ্ট্যগুলি কোনও টেম্পলেটে স্যানিটাইজ করতে ভুলবেন না।