Создаем объект даннх для разных вариаций форм:
const forms = {
'legal': {
1: {
name: 'Форма компании',
type: 'select',
required: true,
fields: {
'empty': '',
'ip': 'ИП',
'ooo': 'OOO',
'ao': 'АО',
}
},
2: {
name: 'Наименование',
type: 'text',
required: true,
},
3: {
name: 'ИНН',
type: 'text',
required: true,
},
4: {
name: 'Комментарий',
type: 'textarea',
required: true,
},
5: {
name: 'Отправить',
type: 'button',
required: true,
},
},
'private': {
1: {
name: 'ФИО',
type: 'text',
required: true,
},
2: {
name: 'Возраст',
type: 'text',
required: true,
},
3: {
name: 'Пол',
type: 'select',
required: true,
fields: {
'empty': '',
'man': 'Мужской',
'woman': 'Женский',
}
},
4: {
name: 'Комментарий',
type: 'textarea',
required: true,
},
5: {
name: 'Отправить',
type: 'button',
required: true,
},
},
}Создаем функцию обхода всех полей выбранной вариации ветки полей:
function createForm (object) {
$.each(object, function(key, value) {
createFormField (value);
});
}Пишем функцию создания полей формы по указанному типу
function createFormField (object) {
let element = $('<div>').attr({
'class': 'form-item',
});
if (object.type != 'button') {
let label = $('<label>').text(object.name);
element.append(label);
}
switch (object.type) {
case 'text':
let input = $('<input>').attr({
'type': object.type,
});
element.append(input);
break;
case 'select':
let select = $('<select>');
$.each(object.fields, function(fieldKey, fieldValue) {
let option = $('<option>').attr({
'value': fieldKey
}).text(fieldValue);
select.append(option);
});
element.append(select);
break;
case 'textarea':
let textarea = $('<textarea>');
element.append(textarea);
break;
case 'button':
let button = $('<button>').text(object.name);
element.append(button);
break;
}
$('form').append(element);
}Выводим прослушиватель события на выбор первонанального поля формы. Далее выводим поля выбранной ветки.
$(function() {
$('select[name="type"]').change(function() {
let type = $(this).val();
$('.form-item').each(function(i, obj) {
if (i != 0) {
obj.remove();
}
});
createForm (forms[type]);
});
});