2017-02-20 2 views
0

Dans un formulaire j'ai 2 entrées. Dans la 1ère entrée, j'utilise un datalist que je charge par JSON et la 2ème entrée le remplit automatiquement lorsque la 1ère entrée est changée. Jusqu'à ici tout fonctionne!Ajout de lignes dans un formulaire une fonction de saisie semi-automatique interrompt

Puis j'ai ajouté un bouton Ajouter où j'ajoute les mêmes lignes. Le problème est que parce que j'utilise id pour sélectionner l'entrée, quand j'ajoute la nouvelle ligne j'ai le même id .. Donc, la saisie semi-automatique ne fonctionne pas ..

Comment puis-je résoudre ce problème? Voici le .

counter = 0; 
 
var dataList = document.getElementById('products'); 
 
var jsonOptions = [{ 
 
    "product": "11111", 
 
    "description": "description 1" 
 
}, { 
 
    "product": "22222", 
 
    "description": "description 2" 
 
}, { 
 
    "product": "33333", 
 
    "description": "description 3" 
 
}]; 
 

 
jsonOptions.forEach(function(item) { 
 

 
    var option = document.createElement('option'); 
 

 
    option.value = item.product; 
 
    option.text = item.description; 
 

 
    dataList.appendChild(option); 
 

 

 
    $(function() { 
 
    $('#product').on('change keyup', function() { 
 

 
     var i = this.value; 
 
     var description = ""; 
 
     var productsInBox = 0; 
 

 
     jsonOptions.forEach(function(a) { 
 
     if (a.product == i) { 
 
      description = a.description; 
 
      productsInBox = a.productsInBox; 
 
     } 
 
     }); 
 
     $('#description').val(description); 
 

 

 
    }); 
 
    }); 
 

 
}); 
 

 

 

 
$('#form1') 
 
    // Add button click handler 
 
    .on('click', '.addButtonDED', function() { 
 
    counter++; 
 
    var $template = $('#addLineInDed'), 
 
     $clone = $template 
 
     .clone() 
 
     .removeClass('hide') 
 
     .removeAttr('id') 
 
     .attr('data-index', counter) 
 
     .insertBefore($template); 
 

 
    // Update the name attributes 
 
    $clone 
 
     .find('[name="product"]').attr('name', 'product-' + counter).end() 
 
     .find('[name="description"]').attr('name', 'description-' + counter).end() 
 

 

 
    }) 
 

 
    // Remove button click handler 
 
    .on('click', '.removeButtonDED', function() { 
 
    var $row = $(this).parents('.form-group'), 
 
     index = $row.attr('data-index'); 
 
    counter--; 
 
    // Remove element containing the fields 
 

 
    $row.remove(); 
 
    });
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet" /> 
 
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" /> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<form id="form1" method="post" class="form-horizontal" role="form"> 
 
    <fieldset> 
 

 

 
    <div class="form-group"> 
 
     <div class="col-xs-2"> 
 
     <input type="text" id="product" list="products" class="form-control" name="product-0" /> 
 
     <datalist id="products"></datalist> 
 
     </div> 
 

 
     <div class="col-xs-4"> 
 
     <input id="description" type="text" class="form-control" name="description-0" /> 
 
     </div> 
 

 

 

 
     <div class="col-xs-1"> 
 
     <button type="button" class="btn btn-default addButtonDED"><i class="fa fa-plus"></i></button> 
 
     </div> 
 
    </div> 
 

 

 
    <div id="addLineInDed" class="form-group hide"> 
 
     <div class="form-group"> 
 
     <div class="col-xs-2"> 
 
      <input type="text" id="product" list="products" class="form-control" name="product-0" /> 
 
      <datalist id="products"></datalist> 
 
     </div> 
 

 
     <div class="col-xs-4"> 
 
      <input id="description" type="text" class="form-control" name="description-0" /> 
 
     </div> 
 

 

 
     <div class="col-xs-1"> 
 
      <button type="button" class="btn btn-default removeButtonDED"><i class="fa fa-minus"></i></button> 
 
     </div> 
 
     </div> 
 
    </div> 
 

 

 
    <div class="col-md-10 "> 
 
     <button type="submit" name="formAction" value="next" class="btn btn-primary">Submit</button> 
 
    </div> 
 

 
    </fieldset> 
 
</form>

+0

si vous avez des problèmes avec les classes d'utilisation ids :)) – madalinivascu

+0

J'ai essayé de remplacer l'id avec des classes, mais quand je change la 1ère entrée alors tous les changements .. – yaylitzis

+0

voient ma réponse ci-dessous – madalinivascu

Répondre

1

classes d'utilisation, renommer vos SELECS aux valeurs de tableau:

counter = 0; 
 
var dataList = $('.products'); 
 
var jsonOptions = [{ 
 
    "product": "11111", 
 
    "description": "description 1" 
 
}, { 
 
    "product": "22222", 
 
    "description": "description 2" 
 
}, { 
 
    "product": "33333", 
 
    "description": "description 3" 
 
}]; 
 

 
jsonOptions.forEach(function(item) { 
 

 
    var option = '<option value="' + item.product + '">' + item.description + '</option>'; 
 

 
    dataList.append(option); 
 
}); 
 

 
$(function() { 
 
    $('body').on('input', '.product,.products', function() { 
 

 
    var i = this.value; 
 
    var description = ""; 
 
    var productsInBox = 0; 
 

 
    jsonOptions.forEach(function(a) { 
 
     if (a.product == i) { 
 
     description = a.description; 
 
     productsInBox = a.productsInBox; 
 
     } 
 
    }); 
 
    $(this).closest('.form-group').find('.description').val(description); 
 

 

 
    }); 
 
}); 
 

 

 

 

 

 
$('#form1').on('click', '.addButtonDED', function() { 
 
    var $template = $('.form-group:last').clone(true, true).find('input').val('').end() 
 
    .find('.addButtonDED').removeClass('addButtonDED').addClass('removeButtonDED').end() 
 
    .find('i').removeClass('fa-plus').addClass('fa-minus').end(); 
 
    $template.insertAfter('.form-group:last'); 
 
    }) 
 

 
    // Remove button click handler 
 
    .on('click', '.removeButtonDED', function() { 
 
    var $row = $(this).closest('.form-group'); 
 
    $row.remove(); 
 
    });
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css" rel="stylesheet" /> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" /> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<form id="form1" method="post" class="form-horizontal" role="form"> 
 
    <fieldset> 
 

 

 
    <div class="form-group"> 
 
     <div class="col-md-2"> 
 
     <input type="text" list="products" class="form-control product" name="product[]" /> 
 
     <datalist id="products" class="products"></datalist> 
 
     </div> 
 

 
     <div class="col-md-4"> 
 
     <input id="" type="text" class="form-control description" name=" description[]" /> 
 
     </div> 
 

 

 

 
     <div class="col-md-1"> 
 
     <button type="button" class="btn btn-default addButtonDED"><i class="fa fa-plus"></i></button> 
 
     </div> 
 
    </div> 
 

 
    <div class="col-md-10 "> 
 
     <button type="submit" name="formAction" value="next" class="btn btn-primary">sUBMIT</button> 
 

 
    </div> 
 

 

 

 
    </fieldset> 
 
</form> 
 

 
</fieldset> 
 
</form>

pour lire les valeurs font une boucle:

foreach($_POST['product'] as $product) { 
//do stuf 
} 
+0

Il y a 2 questions. 1. Dans les nouvelles lignes, chaque entrée a un attribut 'name =" product [] "'. Donc, je ne peux pas lire les valeurs du côté serveur .. 2. Si vous voyez ici https://jsfiddle.net/vr7etpLr/ les nouvelles lignes sont ajoutées sous le bouton soumettre .. – yaylitzis

+0

@yaylitzis 1. vous pouvez lire les valeurs en utilisant une boucle 2.voir https://jsfiddle.net/vr7etpLr/1/ – madalinivascu

+0

Ok !! Merci beaucoup! Une dernière chose! Le bouton de suppression n'existe pas .. – yaylitzis

0

Voyant que vous avez dit que vous avez essayé d'utiliser des classes,

Que diriez-vous encapsuler votre code de sorte que vous aurez une fonction comme ceci: FilldatalistOptions fonction (élément , options)

Vous pouvez alors avoir les 2 datalists avec des ID différents (produits1 et produits2 peut-être). Et il suffit d'appeler la fonction comme ceci:

var dataList1 = document.getElementById('products1'); 
var dataList2 = document.getElementById('products2'); 
FilldatalistOptions(datalist1, jsonOptions); 
FilldatalistOptions(datalist2, jsonOptions); 
+0

Votre solution fonctionnerait si je connaissais le nombre total des lignes. Dans mon cas pensé, je ne sais pas combien de fois l'utilisateur va appuyer sur le bouton Ajouter. – yaylitzis

+0

@yaylitzis je vois. Si vous pouvez contrôler la méthode 'AddLine', vous pouvez également lui demander de mettre à jour une variable globale (disons lineCount ++) et de générer le nouveau datalist avec 'id = 'products' + lineCount'. de cette façon, vous aurez des identifiants individuels générés dynamiquement. Vous saurez également combien de données vous avez au total. – Shtut