JQuery: inserendo grandi quantità di HTML attraverso la manipolazione DOM - manutenibilità?
-
29-10-2019 - |
Domanda
Ho trovato buoni post su buone pratiche che inseriscono elementi DOM usando jQuery come questo, questo e questo
Va bene quando devi solo inserire alcuni elementi, ma mi sembra che queste opzioni siano molto negative dal punto di vista della manutenibilità (il codice viene ripetuto due volte, quindi se è necessario un cambiamento, è necessario che si verifichi due volte molto incline all'errore),
Questa è (solo una piccola parte) quello che ho
<script type="text/javascript">
var phnFragment = "<tr><td align=\"right\">Telephone:</td><td colspan=\"2\"><select name=\"select\" size=\"1\"style=\"width: 100px;\"><option>-- Choose --</option><option>Home</option><option>Mobile</option><option>Work</option></select><input type=\"text\" size=\"20px\" /></td></tr>";
$(document).ready(function() {
$('#addmorephones').click(function() {
$("#phones").append(phnFragment);
});
});
</script>
....
....
<tr id="phones">
<td align="right">Telephone:</td>
<td colspan="2"><select name="select" size="1"
style="width: 100px;">
<option>-- Choose --</option>
<option>Home</option>
<option>Mobile</option>
<option>Work</option>
</select><input type="text" size="20px" /> <a href="javascript:void(0);" id="addmorephones">[+]</a>
</td>
</tr>
C'è un modo migliore per raggiungere questo obiettivo? C'è un modo per dire a JQuery di copiare parte dell'albero DOM e usarlo come frammento per inserire?
Mi piacerebbe imparare alternative
Soluzione
C'è un modo per dire a JQuery di copiare parte dell'albero DOM e usarlo come frammento per inserire?
Sì: clone
. (Non hai nemmeno davvero bisogno di jQuery per questo; cloneNode
fa parte dell'API DOM.) Se ne hai qualcuno id
Valori in ciò che clone, dovrai ripetere il risultato cambiandoli, ovviamente, da allora id
S deve essere unico. Ma è perfetto per cose come le righe da tavolo e simili.
Nel caricamento della pagina, puoi prenderne uno dei reali, clonarlo (senza attaccarlo al documento), purificarlo da tutto ciò di cui non hai bisogno e quindi continuare a clonazione di quel modello. Aiuta a mantenere il tuo JavaScript un po ' disaccoppiato dal tuo markup.
Esempio:
Html:
<table>
<tbody>
<tr><td>I'm a row in the table</td></tr>
</tbody>
</table>
JavaScript:
jQuery(function($) {
var counter = 10,
rowModel;
// Get the row model, clone it, remove the
// content we'll replace anyway.
rowModel = $("tr:first").clone();
rowModel.find("td:first").empty();
// Do our first tick
tick();
// Use the model to append to the table
function tick() {
var clone = rowModel.clone();
clone.find("td:first").html("Added at " + new Date());
$("tbody:first").append(clone);
// Again?
if (--counter > 0) {
setTimeout(tick, 500);
}
}
});
Ovviamente è un rapido e divo, ma hai l'idea. Se usi data-xyz
attributi (consentiti in html5), name
S, class
ES, ecc., Puoi evitare di legare il codice troppo da vicino alla tua struttura.
Altri suggerimenti
In questo caso, potresti afferrare il contenuto di #phones
Durante l'evento pronto:
$(document).ready(function() {
var phnFragment = $("#phones").html();
$('#addmorephones').click(function() {
$("#phones").append(phnFragment);
});
});
Se è necessario copiare informazioni più complesse (come gli eventi), è possibile utilizzare il Metodo .Clone ():
$(document).ready(function() {
var $phnFragment = $("#phones").children().clone();
$('#addmorephones').click(function() {
$("#phones").append($phnFragment.clone());
});
});
TJ ha un'ottima risposta se hai un markup esistente che vuoi riutilizzare. È inoltre possibile utilizzare il tipo di script text/html per mettere il contenuto in markup come modello, come dimostrato qui: