Показать сообщение отдельно
  #18 (permalink)  
Старый 12.12.2016, 16:45
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Scantraxx
а у меня ведь заранее не известно сколько будет полей и какие там будут значения
А этого знать и не обязательно, скрипт клиента или сервера разберется сколько и чего, а значения прерогатива пользователя, что введет, то и будет.

Элементы формы это коллекция, и если из этой коллекции скриптом формировать объект/json, то указывать индексы не обязательно. Без них может получится пролет в таких языках как РНР, который освобождают программиста от заботы разбирать параметры запроса, он уже возвращает готовое, если только самому не захочется работать в RAW данными.

Это пример, в нем только возможность добавления полей в форму, без удаления их. После заполнения формы и ее отправления готовится объект, и преобразованный в JSON отправляется серверу:

<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<style>

</style> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
<script> 
$(function() {
    
    $('form').on('click', 'a.plus', function() {
        //добавление ответов к вопросу
        var fld = $(this).closest('div').prev().find('input').last(), add = fld.clone().val('');
        fld.after(add)
    }).submit(function(e) {
        //формирование отправления и отправка формы
        e.preventDefault();
        var obj = [];
        $.each(this.elements, function() {
            if(this.name=='que_name') obj.push({"que_name" : this.value, "pos_ans" : []});
            else if(this.name=='pos_ans') obj[obj.length-1].pos_ans.push(this.value)
        });
        console.log(JSON.stringify(obj)); //чисто посмотреть что отправляется
        $.ajax({
                type: 'POST',
                url: '/Poll/Create',
                data: {json : JSON.stringify(obj)}, 
                contentType: 'application/json; charset=utf-8',
                success: function (msg) {
                    if (msg == 'True') {
                        alert('Опрос успешно добавлен');
                        window.location.reload(true);
                    };
                }
        });
    });
    //добавление нового вопроса
    $('#add_qst').click(function() {
        var qst = $(this).closest('form').find('div.questionValue').last(), add = qst.clone(), h = add.find('h4');
        h.text(h.text().replace(/\d+/, function(v) {
            return +v + 1;
        }));
        add.find('input').val('').filter('[name="pos_ans"]').not(':first').remove(); 
        
        qst.after(add)
    });
});

</script>     
</head> 

<body>
<form>
<div class="questionValue">
 
            <h4> Вопрос #1</h4>
 
                    <input type="text" name="que_name" />
 
                    <div class="answer">
 
                        <div class="possibleAnswer">
 
                            <input type='text' name='pos_ans' />
 
                        </div>
 
                    </div>
 
                    <div><p><a class="plus">Добавить ответ</a></p>
 
                </div>
 
        </div>
 <a id="add_qst">Добавить вопрос</a>
 <div><button>Send</button></div>
</form>
</body> 
</html>
Ответить с цитированием