Как указать поле данных при отправке формы JQuery AJAX?

Мне нужны данные моей формы HTML, чтобы прибыть на сервер через запрос JQuery AJAX POST в точно таком же формате, как если бы форма была отправлена ​​обычной отправкой. Я пробовал использовать $ .serialize () и $ .serializeArray (), и ни один из них не дает простого

$('#booking-form').on('submit', function(e) {
   var formdata = $(this).serialize();
   // process data and send ajax request
   console.info(formdata);

   $.ajax({
       headers: { 'X-CSRF-TOKEN': $('#booking-form > input[name = "_token"]').val() },
       type: 'POST',
       url: 'book',
       data: { data: formdata },
       success: function (data)
           {
           // Redirect to booking confirmation page:
           if (data.response == 'ok') window.location.replace(data.url);
           else alert('Card payment failed)
           },
       error: function (data) // Server error
           {
           console.info('Error:', data.responseText);
           }
       });

    // Prevent form submit.
    return false;
});

Backend - это Laravel (5.4), но я думаю, что это не проблема, специфичная для Laravel. Регистрация обычной отправки формы дает:

array (
  'code' => '2ZSSAVGXAHMOOKGOC0SC',
  'ownername' => 'My Name',
  'housestreet' => '12 Any street, London',
  'city' => 'London',
  'ownerpcode' => 'ZipCode Here',
  'phone' => '1234567890'
)

Это структура, которую я ищу. Но код выше дает:

array (
  'data' => 'code=BUH1HGXDWW84SWGWSO84&ownername=My+Name&housestreet=12+Any+street%2C+London&city=London&ownerpcode=Zipcode+here&phone=1234567890')

или используя $ .serializeArray (), дает:

array (
  'data' => 
  array (
    0 => 
    array (
      'name' => 'code',
      'value' => 'CC22DPHQ2F40G0GCKKK0',
    ),
    2 => 
    array (
      'name' => 'ownername',
      'value' => 'My Name',
    ),
    3 => 
    array (
      'name' => 'housestreet',
      'value' => '12 Any street, London',
    ),
etc.

Как получить данные в нужном формате на сервере через AJAX (используя JQuery или простой JS)? Я не могу вручную закодировать поля формы в параметре data: в вызове $ .ajax, поскольку некоторые из них динамически генерируются на сервере, а некоторые - с помощью JS во внешнем интерфейсе и включают поля массива для синтаксического анализа PHP (например, форма поле name = "item[0][extra][]")

Спасибо

data: formdata,
Kevin B 28.09.2018 23:57

@KevinB Я думаю, это все равно даст мне строку или массив массивов имени / значения, не так ли?

Alex Kerr 29.09.2018 00:12

Фактически, он даст вам строку во внешнем интерфейсе, но серверная часть должна проанализировать ее в желаемом формате. Просто используйте старый добрый .serialize (), а не .serializeArray.

Kevin B 29.09.2018 00:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
209
1

Ответы 1

Это функция, которую я использую для сериализации стандартной формы для отправки через ajax;

function serializeForm(formSelector) {
  var o = {};
  var a = $(formSelector).serializeArray();
  $.each(a, function() {
    if (o[this.name] !== undefined) {
      if ($("input[name='" + this.name + "'][type='checkbox']").length <= 0) { //stupid checkboxes
        if (!o[this.name].push) {
          o[this.name] = [o[this.name]];
        }
        o[this.name].push(this.value || '');
      }
    } else {
      o[this.name] = this.value || '';
    }
  });
  return o;
}

//it could be used like this
$("input").change(function(){console.info(serializeForm("form"))});
//or this
$.ajax({
  //...snip...
  data: serializeForm("form"),
  //...snip...
});
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <input type = "text" name = "testField" value = "lorem ipsum" />
</form>

Другие вопросы по теме