Передать всю форму как данные в функции jQuery Ajax

155

У меня есть функция jQuery ajax и я хотел бы отправить всю форму в виде данных поста. Мы постоянно обновляем форму, поэтому становится утомительным постоянно обновлять входные данные формы, которые должны быть отправлены в запросе.

Брайан
источник
Мох правильно о FormData () и изображениях. Но уточнить дальше. Дело в том, что сериализация работает только со строками (а не с двоичными данными). функция FormData () работает с формами, для которых тип кодирования установлен как «multipart / form-data». Подробности здесь: developer.mozilla.org/en-US/docs/Web/API/FormData
Джеймс

Ответы:

283

Есть функция, которая делает именно это:

http://api.jquery.com/serialize/

var data = $('form').serialize();
$.post('url', data);
Уилл Вусден
источник
3
$ .post также может вызвать функцию в случае успеха. $ .post ('url', data, function () {....});
SLM
22
примечание: поля формы должны иметь установленный атрибут имени, использование только идентификатора не работает, как описано в документации, и, как я узнал из первых рук.
Ланс Кливленд
что мне нужно какой-то ввод с тем же именем ? Я имею в виду, как иметь их в строках? как я могу отправить это в массиве или что-то?
Франциско Корралес Моралес
2
@FranciscoCorralesMorales называет ваши входные данные следующим образом:person[0].firstName person[0].lastName person[1].firstName person[1].lastName
ахмери
@ahmehri, так это правильный HTML <input name="person[1].lastName">?
Франциско Корралес Моралес
59

serialize () не очень хорошая идея, если вы хотите отправить форму методом post. Например, если вы хотите передать файл через ajax, он не будет работать.

Предположим, что у нас есть форма с этим идентификатором: «myform».

лучшее решение - создать FormData и отправить его:

    var myform = document.getElementById("myform");
    var fd = new FormData(myform );
    $.ajax({
        url: "example.php",
        data: fd,
        cache: false,
        processData: false,
        contentType: false,
        type: 'POST',
        success: function (dataofconfirm) {
            // do something with the result
        }
    });
Мох Арджманди
источник
1
Да, это поддерживается обновленными браузерами, но с помощью сериализации вы можете передавать только строки.
Мох Арджманди
4
Может быть, вы должны упомянуть об этом в своем ответе
toesslab
Спасибо вам обоим varза 2016 год!
Сайлар
1
ты красавица! работал как очарование (данные формы + загрузка файла)
saibbyweb
2
не могу подчеркнуть это достаточно! пытался, form.serialize()но он просто не работал для загрузки файла. new FormData(this)хорошо сработало
Сасанка Пангулури
26

В общем случае используйте serialize()элемент формы.

Помните, что несколько параметров <select> сериализуются под одним ключом, например

<select id="foo" name="foo" multiple="multiple">
    <option value="1">one</option>
    <option value="2">two</option>
    <option value="3">three</option>
</select>

приведет к строке запроса, которая включает в себя несколько вхождений одного и того же параметра запроса:

[path]?foo=1&foo=2&foo=3&someotherparams...

что может быть не то, что вы хотите в бэкэнде.

Я использую этот код JS, чтобы свести несколько параметров к одному ключу, разделенному запятыми (бесстыдно скопированному из ответа комментатора в потоке вместо Джона Резига):

function compress(data) {
    data = data.replace(/([^&=]+=)([^&]*)(.*?)&\1([^&]*)/g, "$1$2,$4$3");
    return /([^&=]+=).*?&\1/.test(data) ? compress(data) : data;
}

что превращает вышесказанное в:

[path]?foo=1,2,3&someotherparams...

В вашем коде JS вы бы назвали это так:

var inputs = compress($("#your-form").serialize());

Надеюсь, это поможет.

Nikola
источник
Если вы используете PHP, тривиально проанализировать строку запроса с помощью функции parse_url
Lobos
Я знаю, что это старый, но как узнать, какие опции были выбраны с помощью этого метода?
yardpenalty.com
18

использование

serialize ()

var str = $("form").serialize();

Сериализуйте форму в строку запроса, которую можно отправить на сервер в запросе Ajax.

Рахул
источник
4

Хороший вариант для jQuery - через FormData . Этот метод также подходит при отправке файлов через форму!

<form id='test' method='post' enctype='multipart/form-data'>
   <input type='text' name='testinput' id='testinput'>
   <button type='submit'>submit</button>
</form>

Ваша функция отправки в jQuery будет выглядеть так:

$( 'form#test' ).submit( function(){
   var data = new FormData( $( 'form#test' )[ 0 ] );

   $.ajax( {
      processData: false,
      contentType: false,

      data: data,
      dataType: 'json',
      type: $( this ).attr( 'method' );
      url: 'yourapi.php',
      success: function( feedback ){
         console.log( "the feedback from your API: " + feedback );
      }
});

Чтобы добавить данные в форму, вы можете использовать скрытый ввод в форме или добавить его на лету:

var data = new FormData( $( 'form#test' )[ 0 ] );
data.append( 'command', 'value_for_command' );
Патрик
источник
2
Чтобы извлечь URL-адрес из атрибута «action» формы, используйте url: $(this).attr('action'),вместо этого
rubo77
1

Вы просто должны опубликовать данные. и используя jquery ajax функцию установить параметры. Вот пример.

<script>
        $(function () {

            $('form').on('submit', function (e) {

                e.preventDefault();

                $.ajax({
                    type: 'post',
                    url: 'your_complete url',
                    data: $('form').serialize(),
                    success: function (response) {
                        //$('form')[0].reset();
                       // $("#feedback").text(response);
                        if(response=="True") {
                            $('form')[0].reset();
                            $("#feedback").text("Your information has been stored.");
                        }
                        else
                            $("#feedback").text(" Some Error has occured Errror !!! ID duplicate");
                    }
                });

            });

        });
    </script>
Даниш Тайиб
источник
0

Другие решения не работали для меня. Возможно, старый DOCTYPE в проекте, над которым я работаю, не позволяет использовать опции HTML5.

Мое решение:

<form id="form_1" action="result.php" method="post"
 onsubmit="sendForm(this.id);return false">
    <input type="hidden" name="something" value="1">
</form>

ЯШ:

function sendForm(form_id){
    var form = $('#'+form_id);
    $.ajax({
        type: 'POST',
        url: $(form).attr('action'),
        data: $(form).serialize(),
        success: function(result) {
            console.log(result)
        }
    });
}
rubo77
источник