2010-10-10 6 views
1

J'ajoute dynamiquement des éléments de formulaire. Les éléments nouvellement ajoutés doivent avoir des attributs name distincts. Je fais cela en commençant par un formulaire de base, en saisissant un ensemble caché d'éléments de formulaire, en les clonant et en les ajoutant. Mon problème est que lorsque je vais définir l'attribut name des nouveaux éléments tous les éléments de formulaire sont modifiés pour l'attribut nouveau nom.Jquery - Pourquoi est-ce que je modifie des éléments que je ne m'attends pas à modifier?

Ainsi, dans l'exemple ci-dessous le bit cloné fraîchement joint a l'attribut name correct mais pas les éléments existants, dans cet exemple, ils sont comme name="notabletitle1" mais après le clonage, ils ont tous le même attribut name (name="notabletitle2"). Pourquoi? Je pensais que cela ne changerait que les éléments que j'ajoute, pas les éléments existants.

Ma forme est comme:

<form> 
<fieldset id="meh"> 
      <legend>Notable</legend> 
      <p class="title"> 
       <input name="notabletitle1" type="text" /> 
       <label for="notabletitle1">Title</label> 
      </p> 
      <p class="text"> 
       <textarea class="thin markItUp" name="notabletext1"></textarea> 
      </p> 
      <p class="link"> 
       <input name="notablelink1" type="text" /> 
       <label for="notablelink1">Link</label> 
      </p> 
      <a class="new" href="#">[ + ]</a> 
</fieldset> 
</form> 

et mes js est comme:

$(".new").click(function() { 
    c = ($(this).parent().children("p").length)/3+1; 
     nam = $(this).parent().children("legend").text().toLowerCase(); 
     n = $("#cloneset1").children(); 
     n.each(function(){ 
      $('input').attr("name", nam+"title"+c); 
      $('textarea').attr("name", nam+"text"+c); 
      $('label').attr("for", nam+"link"+c); 
     }) 
     n.clone().appendTo('#meh'); 

     return false; 
    }); 

la zone utilisée pour le clonage est comme:

<!-- Title, Text, Link set for cloning --> 
    <div style="display:none" id="cloneset1"> 
     <p class="title"> 
      <input name="" type="text" /> 
      <label for="">Title</label> 
     </p> 
     <p class="text"> 
      <textarea class="thin markItUp" name=""></textarea> 
     </p> 
     <p class="link"> 
      <input name="" type="text" /> 
      <label for="">Link</label> 
     </p> 
    </div> 
    <!-- end clone set --> 
+1

'.parent() enfants()' peut être remplacé par '.siblings()' ... – kennytm

Répondre

5

Ce morceau de code modifier tous éléments d'entrée, zone de texte et d'étiquette, pas seulement ceux que vous voulez:

n.each(function(){ 
     $('input').attr("name", nam+"title"+c); 
     $('textarea').attr("name", nam+"text"+c); 
     $('label').attr("for", nam+"link"+c); 
    }) 

Je n'ai pas analysé à fond votre code, mais je pense que vous voulez quelque chose comme ceci:

n.each(function(){ 
     $('input',this).attr("name", nam+"title"+c); 
     $('textarea',this).attr("name", nam+"text"+c); 
     $('label',this).attr("for", nam+"link"+c); 
    }) 

Cela changera seulement les éléments qui sont les enfants de la collection « n ».

+0

Aha! Ça le fait. J'ai essayé $ (ceci, 'input') et ça a échoué ... Je l'ai eu en arrière! Merci beaucoup. – Stuart

0

Vous devez cloner votre cloneset avant de faire des modifications à ce sujet.

n = $("#cloneset1").clone().children(); 
     n.each(function(){ 
      $('input').attr("name", nam+"title"+c); 
      $('textarea').attr("name", nam+"text"+c); 
      $('label').attr("for", nam+"link"+c); 
     }) 
     n.appendTo('#meh'); 
+0

Cela ne fonctionne pas, Arnaud. Cela affectera chaque input/textarea/label dans le formulaire entier, pas seulement les enfants. Il obtient également la numérotation erronée avec la zone clonée obtenant le numéro 1 indépendamment du nombre d'éléments qu'il y a. – Stuart

+0

Attention, lorsque vous clonez des éléments, vous devez garder à l'esprit que l'attribut ID sera également cloné, donc si vous avez un ID à cloner, changez-le plus tard. Votez pour la solution de Philippe d'autre :) –

Questions connexes