2010-04-28 5 views
1

J'ai récemment posé une question sur la création d'éléments avec jquery. Plus précisément, j'ai besoin de boîtes de saisie créées/supprimées en fonction de la valeur d'une boîte de sélection particulière. Cela a été répondu rapidement avec une très bonne solution comme suit:jquery boucle pour créer des éléments avec des valeurs retenues

$('select').change(function() { 
    var num = parseInt($(this).val(), 10); 
    var container = $('<div />'); 
    for(var i = 1; i <= num; i++) { 
     container.append('<input id="id'+i+'" name="name'+i+'" />'); 
    } 
    $('somewhere').html(container); 
}); 

Cela fonctionne très bien. Est-il possible d'avoir les valeurs restantes dans les zones de texte lorsque la sélection est modifiée? Par exemple, disons que la valeur de l'élément select est définie sur '2' de sorte qu'il y ait 2 cases d'entrée. Si des entrées ont déjà été entrées dans ces boîtes et que l'utilisateur modifie la valeur de l'élément select à '3', y a-t-il un moyen de conserver les deux premières zones de saisie pour conserver leur valeur?

Merci pour l'aide à l'avance

Andy

+0

Il ya aussi le cas où un nombre inférieur est sélectionné et je suppose que les boîtes d'entrée doivent être tronquées (à partir de l'ID le plus élevé numéroté). Qu'avez-vous essayé jusqu'à présent? – Lazarus

+0

Heads up. Mettre container.append à l'intérieur de la boucle for est très mauvais pour la performance. Concaténer plutôt tout le balisage à l'intérieur de la boucle (en utilisant + = ou array.push) et utiliser ce balisage dans une opération .append après la boucle. –

Répondre

1

La ligne suivante devrait travail, agréable et simple:

var value = ($("#id"+i).val() || ''); 
container.append('<input id="id'+i+'" name="name'+i+'" value="'+value+'" />'); 

Edité, merci Patrick.

+0

Ceci insérerait 'undefined' s'il n'y a pas de' input' existant. ("Id" est aussi à la mauvaise place Devrait être "#id".) Vous pourriez tester d'abord 'undefined', comme' var value = ($ ("# id" + i) .val() || ' '). » – user113716

1
$('select').change(function() { 
    var num = parseInt($(this).val(), 10); 
    var container = $('<div />'); 
    for(var i = 1; i <= num; i++) { 

     // append existing input if available 
     if($("#id"+i).length){ 
      container.append($("#id"+i)); 
     } 
     else { 
      container.append('<input id="id'+i+'" name="name'+i+'" />'); 
     } 
    } 
    $('somewhere').html(container); 
}); 
+0

Cette ligne 'if ($ (" # id "+ i)) {...' retournera toujours vrai. Vous auriez besoin de 'if ($ (" # id "+ i) .length) {' à la place. – user113716

+0

Je corrige cela. Je vous remercie. –

Questions connexes