Clonage et renommage des éléments de formulaire avec jQuery
Je suis à la recherche d'un moyen efficace pour soit clone/renommer ou de les re-créer des champs d'adresse à offrir la capacité de soumettre des adresses multiples sur la même page. Donc, avec l'exemple de formulaire comme ceci:
<div id="addresses">
<div class="address">
<input type="text" name="address[0].street">
<input type="text" name="address[0].city">
<input type="text" name="address[0].zip">
<input type="text" name="address[0].state">
</div>
</div>
<a href="" id="add_address">Add address form</a>
De ce que je peux comprendre, il y a deux options pour ce faire:
- Recréer la forme du champ par champ et incrémenter l'index qui est le genre de commentaire:
var index = $(".address").length; $('<`input`>').attr({ name: 'address[' + index + '].street', type: 'text' }).appendTo(...); $('<`input`>').attr({ name: 'address[' + index + '].city', type: 'text' }).appendTo(...); $('<`input`>').attr({ name: 'address[' + index + '].zip', type: 'text' }).appendTo(...); $('<`input`>').attr({ name: 'address[' + index + '].state', type: 'text' }).appendTo(...);
- Clone couche Existante et remplacer le nom du clone:
$("div.address").clone().appendTo($("#addresses"));
Que l'on ne vous recommandons d'utiliser en termes d'être plus efficace et si son #2 pouvez-vous s'il vous plaît suggérer comment je pourrais aller sur la recherche et le remplacement de toutes les occurrences de [0] à [1] ([n]). Merci.
source d'informationauteur Micor
Vous devez vous connecter pour publier un commentaire.
En théorie, la façon la plus simple serait de cloner ensuite modifier le nom:
Cependant:
un. jQuery
clone()
est une très mauvaise pièce de travail. Sur IE, il serialises les nœuds de HTML, processus de la chaîne HTML avec la regex (!) pour supprimer son bodge de travail interne attributs ID et ensuite il demande au navigateur de l'analyser à nouveau. C'est l'une de mes parties préférées de jQuery: il est fortement sujette à erreur, perd une partie de l'information, et il est lent (pas que la vitesse qui compte pour les tout petit travail vous semblent être en train de faire ici).Le navigateur natif du
cloneNode(true)
méthode est beaucoup mieux, mais vous ne pouvez pas vraiment utiliser si vous êtes en train de faire jQuery ça parce qu'elle copie de jQuery id internes, susceptibles de créer la confusion de son script. Ugh. Quel gâchis.b. Lorsque vous modifiez une entrée de nom, si c'est par
input.name
comme ici, ou à l'aide deattr()
comme dans votre exemple, il y a des problèmes dans IE<=7.En particulier, bien qu'il soumettra les entrées avec le bon nom de contrôle, ils ne seront pas indexés sous le bon nom dans le
form.elements
HTMLCollection (ou surform
lui-même, bien que vous ne devriez pas l'utiliser de toute façon). Ce n'est pas nécessairement un problème si vous êtes à la sélection des données fondées sur des Id ou des sélecteurs jQuery plutôt que de la vieille école HTMLCollection interface. Le pire, c'est que les boutons radio, si vous utilisez l'un, ne sera pas correctement le nom groupées.Si c'est une préoccupation pour vous, je suis peur d'utiliser
innerHTML
/html()
pour créer la div, comme dans la tvp de la réponse, est votre seule option. (Vous pouvez toujours combiner les deux, de la création à l'aide de HTML, puis de changer les autres attributs de texte et de contenu à l'aide detext()
attr()
val()
etc. pour éviter l'habituel HTML échapper à des problèmes lorsque vous allez dans les coller des chaînes de texte en HTML.)C'est beaucoup moins verbeux si vous écrivez sainement 🙂 je serais probablement utiliser le clone et l'ajouter. Cependantvous allez obtenir des noms en double. Ce n'est pas une grosse affaire si votre back-end peut gérer correctement "adresse[].de la rue", mais il ne peut pas et dans ce cas, vous auriez besoin pour le nettoyage après le clone. Donc je recommande de "se cacher dans l'ordre du générateur de fonction".
Où les remplacer est certains ranger fonction qui comprend une simple interpolation de la cartographie. Je préfère "garder le balisage dans quelque chose qui ressemble à de balisage".
Se soucier de la performance ici est probablement pas justifié.
Je belive je suis passer par la même chose et a trouvé quelques grande source qui va comme ceci:
et le code html est:
....