Saya sudah mendapat array yang saya perulangan. Setiap kali kondisi benar, saya ingin menambahkan salinan HTML
kode di bawah ini ke elemen kontainer dengan beberapa nilai.
Di mana saya dapat meletakkan HTML ini untuk digunakan kembali dengan cara yang cerdas?
<a href="#" class="list-group-item">
<div class="image">
<img src="" />
</div>
<p class="list-group-item-text"></p>
</a>
JQuery
$('.search').keyup(function() {
$('.list-items').html(null);
$.each(items, function(index) {
// APPENDING CODE HERE
});
});
javascript
jquery
json
Patrick Reck
sumber
sumber
Jawaban:
Anda dapat memutuskan untuk menggunakan mesin template dalam proyek Anda, seperti:
Jika Anda tidak ingin menyertakan pustaka lain, John Resig menawarkan solusi jQuery , mirip dengan yang di bawah ini.
Browser dan pembaca layar mengabaikan jenis skrip yang tidak dikenal:
Menggunakan jQuery, menambahkan baris berdasarkan template akan menyerupai:
sumber
Pertanyaan lama, tetapi karena pertanyaannya menanyakan "menggunakan jQuery", saya pikir saya akan memberikan opsi yang memungkinkan Anda melakukan ini tanpa memperkenalkan ketergantungan vendor.
Meskipun ada banyak mesin template di luar sana, banyak dari fitur mereka tidak disukai baru-baru ini, dengan iteration (
<% for
), conditionals (<% if
) dan transforms (<%= myString | uppercase %>
) dilihat sebagai bahasa mikro paling baik, dan anti-pola paling buruk. Praktik pembuatan template modern mendorong hanya memetakan objek ke representasi DOM (atau lainnya), misalnya apa yang kita lihat dengan properti yang dipetakan ke komponen di ReactJS (terutama komponen stateless).Template Di Dalam HTML
Satu properti yang dapat Anda andalkan untuk menyimpan HTML untuk template Anda di samping HTML Anda lainnya, adalah dengan menggunakan non-executing
<script>
type
, mis<script type="text/template">
. Untuk kasus Anda:Saat dokumen dimuat, baca template Anda dan beri tokenize menggunakan sederhana
String#split
Perhatikan bahwa dengan token kami, Anda mendapatkannya dalam
[text, property, text, property]
format bergantian . Ini memungkinkan kita memetakannya dengan baik menggunakanArray#map
, dengan fungsi pemetaan:Dimana
props
bisa terlihat seperti{ url: 'http://foo.com', img: '/images/bar.png', title: 'Lorem Ipsum' }
.Menyatukan semuanya dengan asumsi Anda telah mem-parsing dan memuat Anda
itemTpl
seperti di atas, dan Anda memilikiitems
array dalam lingkup:Pendekatan ini juga hanya sedikit jQuery - Anda harus dapat mengambil pendekatan yang sama menggunakan vanilla javascript dengan
document.querySelector
dan.innerHTML
.jsfiddle.dll
Template di dalam JS
Sebuah pertanyaan untuk ditanyakan pada diri sendiri adalah: apakah Anda benar-benar ingin / perlu mendefinisikan template sebagai file HTML? Anda selalu dapat membuat komponen + menggunakan kembali template dengan cara yang sama seperti Anda menggunakan kembali sebagian besar hal yang ingin Anda ulangi: dengan sebuah fungsi.
Di es7-land, menggunakan destructuring, template strings, dan arrow-functions, Anda dapat menuliskan fungsi komponen yang tampak cantik yang dapat dengan mudah dimuat menggunakan
$.fn.html
metode di atas.Kemudian Anda dapat dengan mudah merendernya, bahkan dipetakan dari array, seperti ini:
Oh dan catatan terakhir: jangan lupa untuk membersihkan properti Anda yang diteruskan ke template, jika mereka dibaca dari DB, atau seseorang dapat mengirimkan HTML (dan kemudian menjalankan skrip, dll.) Dari halaman Anda.
sumber
Gunakan template HTML sebagai gantinya!
Karena jawaban yang diterima akan mewakili metode skrip yang kelebihan beban, saya ingin menyarankan yang lain yang, menurut saya, jauh lebih bersih dan lebih aman karena risiko XSS yang datang dengan skrip yang kelebihan beban.
Saya membuat demo untuk menunjukkan kepada Anda bagaimana menggunakannya dalam sebuah aksi dan bagaimana menyuntikkan satu template ke template lainnya, mengedit dan kemudian menambahkan ke DOM dokumen.
contoh html
contoh js
HTML <template>
+ Isinya tidak aktif secara efektif sampai diaktifkan. Pada dasarnya, markup Anda adalah DOM tersembunyi dan tidak dirender.
+ Konten apa pun dalam templat tidak akan memiliki efek samping. Skrip tidak berjalan, gambar tidak dimuat, audio tidak diputar ... hingga templat digunakan.
+ Konten dianggap tidak ada dalam dokumen. Menggunakan
document.getElementById()
atauquerySelector()
di halaman utama tidak akan mengembalikan node turunan dari sebuah template.+ Template dapat ditempatkan di manapun dalam
<head>
,<body>
atau<frameset>
dan dapat berisi jenis konten yang diperbolehkan dalam elemen-elemen. Perhatikan bahwa "di mana saja" berarti<template>
dapat digunakan dengan aman di tempat-tempat yang tidak diizinkan oleh pengurai HTML.Kembali
Dukungan browser seharusnya tidak menjadi masalah tetapi jika Anda ingin mencakup semua kemungkinan, Anda dapat melakukan pemeriksaan mudah:
Beberapa wawasan tentang Metode skrip overloading
<script>
tag memilikidisplay:none
default."text/javascript"
..innerHTML
. Penguraian string waktu proses dari data yang disediakan pengguna dapat dengan mudah menyebabkan kerentanan XSS.Artikel lengkap: https://www.html5rocks.com/en/tutorials/webcomponents/template/#toc-old
Referensi yang berguna: https://developer.mozilla.org/en-US/docs/Web/API/Document/importNode http://caniuse.com/#feat=queryselector
MEMBUAT KOMPONEN WEB Tutorial membuat komponen web kustom menggunakan template HTML oleh Trawersy Media: https://youtu.be/PCWaFLy3VUo
sumber
template
elemen tidak didukung oleh Internet Explorer (pada 2018, IE11). Diuji dengan contoh 580 w3c.github.io/html/single-page.html .<template>
, meskipun saya akan merekomendasikan menggunakan kelas secara bebas, jadi jelas alat peraga apa yang diatur ke apa. Masih diperlukan beberapa keterampilan js untuk memetakan data Anda ke dalam template dengan benar, terutama menggunakan pendekatan gaya komponen untuk pemetaan dalam kumpulan data yang besar. Secara pribadi saya masih suka hanya membangun HTML dalam fungsi, atau idealnya membangun DOM langsung dengan JS itu sendiri dan meninggalkan HTML sama sekali (misalnya bagaimana React melakukannya).Tambahkan di suatu tempat di tubuh
lalu buat css
dan tambahkan ke js Anda
sumber
.children().clone()
, daripada.html()
. Kecepatannya sekitar 3: 1 untuk acak yang<tr/>
saya miliki di halaman menggunakan kode inii=10000; time=performance.now(); while (--i) {$a.clone().append(0 ? $b.html() : $b.children().clone())} performance.now()-time
. Rasionya sebenarnya sedikit lebih dibesar-besarkan karena saya menggunakan $ a.clone (), tetapi mencoba mengosongkannya setiap iterasi lebih merupakan kinerja yang sukses daripada kloning, jadi saya tidak yakin bagaimana membuatnya lebih akurat karena fungsi pengaturan waktu memiliki biayanya sendiri.Alternatif lain: Murni
Saya menggunakannya dan itu sangat membantu saya. Contoh yang ditampilkan di situs web mereka:
HTML
JSON
Hasil
sumber
Untuk mengatasi masalah ini, saya mengenali dua solusi:
Yang pertama berjalan dengan AJAX, yang dengannya Anda harus memuat templat dari file lain dan menambahkan setiap kali Anda mau
.clone()
.Perhatikan bahwa acara tersebut harus ditambahkan setelah ajax selesai untuk memastikan datanya tersedia!
Yang kedua adalah menambahkannya secara langsung di mana saja di html asli, pilih dan sembunyikan di jQuery:
Anda bisa setelah menambahkan contoh baru dari template dengan
Sama seperti yang sebelumnya, tetapi jika Anda tidak ingin templatenya tetap ada, tetapi hanya di javascript, saya rasa Anda dapat menggunakan (belum mengujinya!)
.detach()
Daripada menyembunyikan..detach()
menghapus elemen dari DOM sambil menjaga data dan peristiwa tetap hidup (.remove () tidak!).sumber
Jawaban yang sangat bagus dari DevWL tentang penggunaan elemen template HTML5 asli . Untuk berkontribusi pada pertanyaan bagus ini dari OP, saya ingin menambahkan tentang cara menggunakan
template
elemen ini menggunakan jQuery, misalnya:Isi dari
template
tidak html, tetapi hanya diperlakukan sebagai data, sehingga Anda perlu untuk membungkus konten menjadi objek jQuery untuk mengakses maka metode jQuery.sumber