Pour clone le fieldset et l'ajouter à la même parent:
var fieldset = $("#question1"); // Get the fieldset
var clone = fieldset.clone(); // Clone it
clone.attr("id", "question2"); // Set its ID to "question2"
clone.appendTo(fieldset.parent()); // Add to the parent
Remarque nous sommes changing l'ID avant de l'ajouter à l'arbre, puisque vous ne pouvez pas avoir deux éléments avec le même ID .
Pour faire des choses avec les éléments à l'intérieur, vous pouvez utiliser .children()
ou .find()
sur votre variable clone
avec un sélecteur pour sélectionner les enfants/descendants que vous voulez (une fois que vous avez ajouté le clone au parent). Par exemple, pour nettoyer les id
s sur les entrées:
clone.find('input').each(function() {
if (this.id) {
// It has an ID, which means the original had an ID, which
// means your DOM tree is temporarily invalid; fix the ID
this.id = /* ...derive a new, unique ID here... */;
}
});
Notez que dans le rappel each
, this
est pas une instance jQuery, il est l'élément brut. (D'où ma configuration this.id
directement.) Si vous vouliez obtenir une instance jQuery pour l'élément, vous feriez var $this = $(this);
et ensuite utiliser $this.attr("id", ...)
à la place. Mais il n'y a pas de besoin particulier sauf si vous faites quelque chose d'autre que de changer l'ID.
répondre à votre question sur les ID renumérotation, vous devez être sûr de mettre à jour ce qui est en utilisant ces ID ainsi que les ID réels sur les éléments d'entrée.
Mais en termes de faire la mise à jour sur les éléments d'entrée, vous pourrait le faire en lisant le nombre et incrémenter jusqu'à ce que vous obtenez qui ne soit pas utilisé:
clone.find('input').each(function() {
var id;
if (this.id) {
id = this.id;
do {
id = id.replace(/[0-9]+$/g, function(num) {
return String(Number(num) + 1);
});
}
while ($("#" + id).length > 0);
this.id = id;
}
});
... qui vous donnera "input_radio2" si l'ID original était "input_radio1", mais je pense que j'utiliserais probablement une convention de nommage différente à la place. Par exemple, vous pouvez préfixer vos différents identifiants d'entrée avec l'ID de la question:
<fieldset id='question1'>
...
<input id=-'question1:input_radio1' />
</fieldset>
... puis il suffit de remplacer « Question1 » par « Question2 » dans les ID clonés. (Colons [:
] sont parfaitement valides dans les ID.)
Si vous pouvez éviter d'avoir des ID sur toutes vos entrées, ce serait la solution. Par exemple, à moins que votre balisage empêche pour une autre raison, vous pouvez associer un input
avec son label
par confinement plutôt que d'utiliser for
:
<label>First name: <input type='text' ... /></label>
Beaucoup d'options. :-)
Il est un peu difficile de ce que vous essayez de faire. Pourquoi clones-tu le fieldset - veux-tu l'insérer ailleurs? Et qu'avez-vous besoin de changer à l'intérieur du fieldset cloné? –
Pour la partie de comment accéder à la classe par ID, j'ai eu des réponses de travail, merci à tous pour votre réponse rapide. Cependant, j'ai toujours besoin d'aide pour accéder aux entrées trouvées sur le jeu de champs. Dois-je ajouter une classe à chaque entrée, puis modifier son identifiant en utilisant la méthode attr? – Luci
Oui, vous devez changer les ID sur les entrées, mais non, vous n'avez pas besoin de mettre une classe sur eux pour le faire. J'ai mis à jour ma réponse pour montrer comment faire cela. –