Передайте всю форму як дані у функції 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', дані, функція () {....});
slm

22
Примітка: у полях форми має бути встановлений атрибут імені, використання лише ідентифікатора не працює як задокументовано, і як я з'ясував з перших рук.
Ленс Клівленд

для чого мені потрібен вхід з такою ж назвою ? Я маю на увазі, як, якщо їх мати в рядах? як я можу надіслати це у масиві чи щось таке?
Франсіско Корралес Моралес

2
@FranciscoCorralesMorales називає свої вклади так:person[0].firstName person[0].lastName person[1].firstName person[1].lastName
ahmehri

@ahmehri, так це дійсний HTML <input name="person[1].lastName">?
Франциско Корралес Моралес

59

serialize () - не дуже гарна ідея, якщо ви хочете надіслати форму методом публікації. Наприклад, якщо ви хочете передати файл через ajax, він не працює.

Припустимо, у нас є форма з таким id: "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());

Сподіваюся, що це допомагає.


Якщо ви використовуєте PHP, тривіально розбирати рядок запитів за допомогою функції parse_url
Lobos

Я знаю, що це старе, але як вам знати, який варіант (и) було обрано за допомогою цього методу?
yardpenalty.com

18

Використовуйте

серіалізувати ()

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>

js:

function sendForm(form_id){
    var form = $('#'+form_id);
    $.ajax({
        type: 'POST',
        url: $(form).attr('action'),
        data: $(form).serialize(),
        success: function(result) {
            console.log(result)
        }
    });
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.