"Dynamic form fields - Add new field on focus or change"
Bootstrap 3.3.0 Snippet by odortega

<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css"> <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.0/js/bootstrap.min.js"></script> <script src="//code.jquery.com/jquery-1.11.1.min.js"></script> <!------ Include the above in your HEAD tag ----------> <div class="container"> <h3>Selects</h3> <div class="row"> <div class="form-group form-group-multiple-selects col-xs-11 col-sm-8 col-md-4"> <div class="input-group input-group-multiple-select col-xs-8"> <select class="form-control" name="values[]"> <option value="">Select one</option> <option value="1">Option 1</option> <option value="2">Option 2</option> <option value="3">Option 3</option> <option value="4">Option 4</option> </select> <span class="input-group-addon input-group-addon-remove"> <span class="glyphicon glyphicon-remove"></span> </span> </div> </div> <div class="col-xs-2"> <button type="button" class="btn btn-default addButton"><i class="fa fa-plus"></i></button> </div> </div> </div> <div class="container"> <h3>Sub select</h3> <div class="row"> <div class="form-group form-group-multiple-subselects col-xs-11 col-sm-8 col-md-4"> <div class="input-group input-group-multiple-subselect col-xs-12"> <select class="form-control" name="subvalues[]"> <option value="">Select one</option> <option value="1">Sub Option 1</option> <option value="2">Sub Option 2</option> <option value="3">Sub Option 3</option> <option value="4">Sub Option 4</option> </select> <!--span class="input-group-addon input-group-addon-remove"> <span class="glyphicon glyphicon-remove"></span> </span--> </div> </div> </div> </div> <div class="container"> <h3>Fields</h3> <div class="row"> <div class="form-group form-group-options col-xs-11 col-sm-8 col-md-4"> <div class="input-group input-group-option col-xs-12"> <input type="text" name="option[]" class="form-control" placeholder="Focus me"> <!--span class="input-group-addon input-group-addon-remove"> <span class="glyphicon glyphicon-remove"></span> </span--> </div> </div> </div> </div>
/* Text fields */ div.input-group-option:last-child span.input-group-addon-remove{ display: none; } div.input-group-option:last-child input.form-control{ border-bottom-right-radius: 3px; border-top-right-radius: 3px; } div.input-group-option span.input-group-addon-remove{ cursor: pointer; } div.input-group-option{ margin-bottom: 3px; } /* Selects */ div.input-group-multiple-select:last-child span.input-group-addon-remove{ display: none; } div.input-group-multiple-select:last-child input.form-control{ border-bottom-right-radius: 3px; border-top-right-radius: 3px; } div.input-group-multiple-select span.input-group-addon-remove{ cursor: pointer; background: none; border: none; } div.input-group-multiple-select{ margin-bottom: 5px; }
/* Text fields */ /*$(function(){ $(document).on('focus', 'div.form-group-options div.input-group-option:last-child input', function(){ var sInputGroupHtml = $(this).parent().html(); var sInputGroupClasses = $(this).parent().attr('class'); $(this).parent().parent().append('<div class="'+sInputGroupClasses+'">'+sInputGroupHtml+'</div>'); }); $(document).on('click', 'div.form-group-options .input-group-addon-remove', function(){ $(this).parent().remove(); }); }); */ /* Selects */ $(function(){ var values = new Array(); //$(document).on('change', '.form-group-multiple-selects .input-group-multiple-select:last-child select', function(){ $(document).on('click', '.addButton', function(){ var selecField = $('.form-group-multiple-selects .input-group-multiple-select:last-child select'); var selectsLength =selecField.parent().parent().find('.input-group-multiple-select select').length; var optionsLength = (selecField.find('option').length)-1; if(selectsLength < optionsLength){ var sInputGroupHtml = selecField.parent().html(); var sInputGroupClasses = selecField.parent().attr('class'); selecField.parent().parent().append('<div class="'+sInputGroupClasses+'">'+sInputGroupHtml+'</div>'); //odortega@gmail.com 2017/01/19 var subSelectfield = $('.form-group-multiple-subselects .input-group-multiple-subselect:last-child select'); var subsInputGroupHtml = subSelectfield.parent().html(); var subsInputGroupClasses = subSelectfield.parent().attr('class'); subSelectfield.parent().parent().append('<div class="'+subsInputGroupClasses+'">'+subsInputGroupHtml+'</div>'); var textfield = $('div.form-group-options div.input-group-option:last-child input'); var sInputGroupHtml = textfield.parent().html(); var sInputGroupClasses = textfield.parent().attr('class'); textfield.parent().parent().append('<div class="'+sInputGroupClasses+'">'+sInputGroupHtml+'</div>'); //FIN odortega@gmail.com 2017/01/19 } updateValues($(this).parent().parent()); }); $(document).on('change', '.form-group-multiple-selects .input-group-multiple-select:not(:last-child) select', function(){ updateValues($(this).parent().parent()); }); $(document).on('click', '.input-group-addon-remove', function(){ var oSelectContainer = $(this).parent().parent() $(this).parent().remove(); //odortega@gmail.com 2017/01/19 var textfield = $('div.form-group-options div.input-group-option:last-child input'); textfield.parent().remove(); var subSelectfield = $('.form-group-multiple-subselects .input-group-multiple-subselect:last-child select'); subSelectfield.parent().remove(); //FIN odortega@gmail.com 2017/01/19 updateValues(oSelectContainer); }); function updateValues(oSelectContainer){ values = new Array(); $(oSelectContainer).find('.input-group-multiple-select select').each(function(){ var value = $(this).val(); if(value != 0 && value != ""){ values.push(value); } }); $(oSelectContainer).find('.input-group-multiple-select select').find('option').each(function(){ var optionValue = $(this).val(); var selectValue = $(this).parent().val(); if(in_array(optionValue,values)!= -1 && selectValue != optionValue) { $(this).attr('disabled', 'disabled'); } else { $(this).removeAttr('disabled'); } }); } function in_array(needle, haystack){ var found = 0; for (var i=0, length=haystack.length;i<length;i++) { if (haystack[i] == needle) return i; found++; } return -1; } // Update all options for first use $('.form-group-multiple-selects').each(function(i, e){ updateValues(e); }); });

Related: See More


Questions / Comments: