формувати серіалізацію javascript (без рамки)


141

Цікаво, чи є функція в javascript без jquery чи будь-яка рамка, яка дозволяє мені серіалізувати форму та отримати доступ до серіалізованої версії?


1
Що ви маєте на увазі під "доступом до серіалізованої версії"? Я розробив сценарій, у якого немає сторонніх залежностей, які можуть перетворити форму HTML в об'єкт, подібний JSON, який є багатовимірним: github.com/serbanghita/formToObject - якщо це допоможе опустити відповідь
Șerban Ghiță

Відповіді:


39

Мініатюрна бібліотека із серіалізації не покладається на рамки. Крім щось подібне, вам потрібно буде самостійно реалізувати функцію серіалізації. (хоча при вазі 1,2 кілобайт, чому б не використати його?)


2
Це було ідеально. Але довелося додати case 'email':у розділ введення коду
aravind

о, тепер я бачу, googlecode не працює без javascript. Він просто плюєThat's an error
користувач1040495

3
Будь ласка, додайте код, а не лише посилання на бібліотеку. Якщо бібліотека є відкритим кодом, ви зможете скопіювати відповідний код.
Лука

171

Ось чистий підхід JavaScript:

var form = document.querySelector('form');
var data = new FormData(form);
var req = new XMLHttpRequest();
req.send(data);

Хоча це, здається, працює лише для POST-запитів.

https://developer.mozilla.org/en-US/docs/Web/API/FormData


13
Зауважте, це надсилає мультичастину, яка погано працює з деякими простими послугами REST (т.
Е.

Я думаю, ти маєш рацію, що вона працює лише з POST-запитами. Це було не відразу зрозуміло в документах.
маніша

це не працює для мене. Форма глибоко вкладена. Об'єкт FormData порожній…
chitzui

Зауважте, можливо, вам доведеться використовувати req.open("POST", "<your-url>");раніше, req.send(data);інакше у мене сталася помилка InvalidStateError: XMLHttpRequest state must be OPENED.на Firefox 66. Це повинно працювати з іншими запитами, як, наприклад, PUT, якщо ви заміните POST на PUT.
baptx

1
Подумайте над цим: як ви могли надіслати об’єкт FormData методом "GET"? Так, FormData працює лише з "POST".
Rex the Strange

88

Тільки для сучасних браузерів

Якщо ви орієнтуєтесь на браузери, які підтримують URLSearchParamsAPI ( найновіші браузери ) та FormData(formElement)конструктор ( останні останні браузери, крім Edge ), використовуйте це:

new URLSearchParams(new FormData(formElement)).toString()

Скрізь, крім IE

Для веб-переглядачів, які підтримують, URLSearchParamsале не FormData(formElement)конструктор, використовуйте цю поліфункцію FormData та цей код (працює скрізь, крім IE):

new URLSearchParams(Array.from(new FormData(formElement))).toString()

Приклад

Сумісний з IE 10

Навіть для старих веб-переглядачів (наприклад, IE 10) використовуйте поліфактор FormData , Array.fromпри необхідності полісистему та цей код:

Array.from(
  new FormData(formElement),
  e => e.map(encodeURIComponent).join('=')
).join('&')

Тут .toString()справді потрібно?
Оллі Вільямс

1
Якщо ви хочете рядок, а ні URLSearchParams, то так. Перетворення рядків також відбувається неявно, якщо ви інтерполюєте або додаєте його до рядка, і в цьому випадку явний toStringвиклик не потрібен.
glebm

Один лайнер не працював для мене на iOS Safari станом на квітень 2018
jchook

Яку помилку ви отримуєте та яку версію Safari це? Можливо, він new FormData(formElement)ще не підтримується?
glebm

@glebm так, це не підтримується в Safari, ви знайшли якесь інше рішення?
rishiAgar

34
function serialize (form) {
    if (!form || form.nodeName !== "FORM") {
            return;
    }
    var i, j, q = [];
    for (i = form.elements.length - 1; i >= 0; i = i - 1) {
        if (form.elements[i].name === "") {
            continue;
        }
        switch (form.elements[i].nodeName) {
            case 'INPUT':
                switch (form.elements[i].type) {
                    case 'text':
                    case 'tel':
                    case 'email':
                    case 'hidden':
                    case 'password':
                    case 'button':
                    case 'reset':
                    case 'submit':
                        q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                        break;
                    case 'checkbox':
                    case 'radio':
                        if (form.elements[i].checked) {
                                q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                        }                                               
                        break;
                }
                break;
                case 'file':
                break; 
            case 'TEXTAREA':
                    q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                    break;
            case 'SELECT':
                switch (form.elements[i].type) {
                    case 'select-one':
                        q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                        break;
                    case 'select-multiple':
                        for (j = form.elements[i].options.length - 1; j >= 0; j = j - 1) {
                            if (form.elements[i].options[j].selected) {
                                    q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].options[j].value));
                            }
                        }
                        break;
                }
                break;
            case 'BUTTON':
                switch (form.elements[i].type) {
                    case 'reset':
                    case 'submit':
                    case 'button':
                        q.push(form.elements[i].name + "=" + encodeURIComponent(form.elements[i].value));
                        break;
                }
                break;
            }
        }
    return q.join("&");
}

Джерело: http://code.google.com/p/form-serialize/source/browse/trunk/serialize-0.1.js


1
Ця серіалізація не здається сумісною з серіалізацією стандартної форми, де пробіли представлені символом "+". Вищезазначене використовує лише enodeURIComponent , який буде кодувати простір як "% 20". Якщо потрібна відповідність, в кінці можна використовувати регулярний вираз для перетворення "% 20" в "+" перед передачею.
RobG

3
Я додав таку змінену версію до gist.github.com/brettz9/7147458 (з деякими іншими вдосконаленнями)
Brett Zamir

3
Кнопки надсилання не обов’язково надсилати, кнопки скидання ніколи не слід надсилати, а кнопки лише там, де вони використовуються для надсилання, і в цьому випадку трактуються як кнопка подання. Див. HTML5 4.10.22 Подання форми .
RobG

не серіалізувати електронну пошту типу введення.
Іван

25

Ось дещо змінена версія TibTibs ':

function serialize(form) {
    var field, s = [];
    if (typeof form == 'object' && form.nodeName == "FORM") {
        var len = form.elements.length;
        for (i=0; i<len; i++) {
            field = form.elements[i];
            if (field.name && !field.disabled && field.type != 'file' && field.type != 'reset' && field.type != 'submit' && field.type != 'button') {
                if (field.type == 'select-multiple') {
                    for (j=form.elements[i].options.length-1; j>=0; j--) {
                        if(field.options[j].selected)
                            s[s.length] = encodeURIComponent(field.name) + "=" + encodeURIComponent(field.options[j].value);
                    }
                } else if ((field.type != 'checkbox' && field.type != 'radio') || field.checked) {
                    s[s.length] = encodeURIComponent(field.name) + "=" + encodeURIComponent(field.value);
                }
            }
        }
    }
    return s.join('&').replace(/%20/g, '+');
}

Полі відключені відкидаються, а імена також кодуються URL-адресами. Заміна Regex символів% 20 відбувається лише один раз, перед поверненням рядка.

Рядок запиту відповідає однаковій формі результату методу $ .serialize () jQuery.


6
+1 за те, що потрібно вдосконалити код. Мені подобається, коли люди знаходять мої недоліки, оскільки це хороша можливість навчання. +1 за те, що він також виглядає добре. -1 тому, що я не можу дати +2 = (
TibTibs

1
ви можете додати form.nodeName.toLowerCase() == "form"замістьform.nodeName == "FORM"
StefanNch

12

Я почав з відповіді Джондаве Декано.

Це повинно вирішити декілька питань, згаданих у відповідях на його функції.

  1. Замініть% 20 ​​символом +.
  2. Типи "Надіслати / Кнопка" буде надіслано лише у випадку, якщо на них натиснули кнопку, щоб надіслати форму.
  3. Кнопки скидання будуть ігноровані.
  4. Код здався мені зайвим, оскільки він робить по суті те ж саме, незалежно від типів поля. Не кажучи вже про несумісність з типами полів HTML5, таких як 'tel' та 'email', я таким чином видалив більшість специфік з операторами перемикання.

Типи кнопок все одно будуть ігноруватися, якщо вони не мають значення імені.

function serialize(form, evt){
    var evt    = evt || window.event;
    evt.target = evt.target || evt.srcElement || null;
    var field, query='';
    if(typeof form == 'object' && form.nodeName == "FORM"){
        for(i=form.elements.length-1; i>=0; i--){
            field = form.elements[i];
            if(field.name && field.type != 'file' && field.type != 'reset'){
                if(field.type == 'select-multiple'){
                    for(j=form.elements[i].options.length-1; j>=0; j--){
                        if(field.options[j].selected){
                            query += '&' + field.name + "=" + encodeURIComponent(field.options[j].value).replace(/%20/g,'+');
                        }
                    }
                }
                else{
                    if((field.type != 'submit' && field.type != 'button') || evt.target == field){
                        if((field.type != 'checkbox' && field.type != 'radio') || field.checked){
                            query += '&' + field.name + "=" + encodeURIComponent(field.value).replace(/%20/g,'+');
                        }   
                    }
                }
            }
        }
    }
    return query.substr(1);
}

Ось як я зараз використовую цю функцію.

<form onsubmit="myAjax('http://example.com/services/email.php', 'POST', serialize(this, event))">

6
+1 за добре відремонтований код. -1 за ігнорування відключених полів, які не повинні відображатися в рядку запиту. +1 для дуже елегантних для висловлювання, які уникають повторного підрахунку елементів форми. Всього: +1 :-) Дякую!
Саймон Штейнбергер

Хороша примітка щодо інвалідних полів, я нещодавно зіткнувся з цим з новою функцією, яку я писав. +1 вам обом, адже мені подобається читати веселі коментарі. :)
TibTibs

11

Якщо вам потрібно надіслати форму "myForm" за допомогою POST у форматі json, ви можете зробити:

const formEntries = new FormData(myForm).entries();
const json = Object.assign(...Array.from(formEntries, ([x,y]) => ({[x]:y})));
fetch('/api/foo', {
  method: 'POST',
  body: JSON.stringify(json)
});

Другий рядок перетворюється з масиву на зразок:

[["firstProp", "firstValue"], ["secondProp", "secondValue"], ...and so on... ]

... у звичайний об'єкт, наприклад:

{"firstProp": "firstValue", "secondProp": "secondValue", ...and so on ... }

... це робить це перетворення, передаючи mapFn в Array.from (). Ця mapFn застосовується до кожної пари ["a", "b"] і перетворює їх у {"a": "b"} так, що масив містить багато об'єктів, у яких по одному властивості. MapFn використовує "деструктуризацію" для отримання імен першої та другої частин пари, а також використовує ES6 "ComputedPropertyName", щоб встановити ім'я властивості в об'єкті, поверненому mapFn (ось чому так сказано "[ x]: щось ", а не просто" x: щось ".

Усі ці об'єкти єдиного властивості потім передаються в аргументи функції Object.assign (), яка об'єднує всі об'єкти єдиного властивості в один об'єкт, який має всі властивості.

Array.from (): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from

Руйнування параметрів: https://simonsmith.io/destructuring-objects-as-function-parameters-in-es6/

Детальніше про обчислені назви властивостей тут: Змінна як ім'я властивості в буквальному об’єкті JavaScript?


Це працює для мене, навіть якщо я не розумію другий рядок, чи можете ви дати більше інформації про це, будь ласка ??
Espoir Murhabazi

Прекрасна відповідь, використовуючи оператор розповсюдження та нативні методи Object and Array.
Вінні Фонсека

Зауважте, що цей підхід не підтримується в IE (.entries ())
чувак,

Сторінка MDN для Object.entries () містить короткий поліфайл, який можна використовувати для IE: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…, але IE також не підтримує оператора розповсюдження.
molsson

ви можете серіалізувати форму за допомогою нового методу Object.fromEntries (новий FormData (myFormElement)).
miguel savignano

10

Працює у всіх браузерах.

const formSerialize = formElement => {
  const values = {};
  const inputs = formElement.elements;

  for (let i = 0; i < inputs.length; i++) {
    values[inputs[i].name] = inputs[i].value;
  }
  return values;
}

const dumpValues = form => () => {
  
  const r = formSerialize(form);
  console.log(r);
  console.log(JSON.stringify(r));
}

const form = document.querySelector('form');

dumpValues(form)();

form.addEventListener('change',dumpValues(form));
<form action="/my-handling-form-page" method="post">
  <div>
    <label for="name">Name:</label>
    <input type="text" id="name" name="user_name" value="John">
  </div>
  <div>
    <label for="mail">E-mail:</label>
    <input type="email" id="mail" name="user_mail" value="john@jonhson.j">
  </div>
  <div>
    <label for="interests">Interest:</label>
    <select required=""  id="interests" name="interests">
      <option value="" selected="selected">- None -</option>
      <option value="drums">Drums</option>
      <option value="js">Javascript</option>
      <option value="sports">Sports</option>
      <option value="trekking">Trekking</option>
    </select>
  </div>
  <div>
    <label for="msg">Message:</label>
    <textarea id="msg" name="user_message">Hello My Friend</textarea>
  </div>
</form>


це робить json, я припускаю, що автор запитував про серіалізацію до URI.
jaskmar

Я б хотів, щоб це працювало для декількох форм вибору варіантів.
Зак Сміт

@ZachSmith Це вже працювало, але я додав вам приклад, щоб перевірити це
David Lemon

8
HTMLElement.prototype.serialize = function(){
    var obj = {};
    var elements = this.querySelectorAll( "input, select, textarea" );
    for( var i = 0; i < elements.length; ++i ) {
        var element = elements[i];
        var name = element.name;
        var value = element.value;

        if( name ) {
            obj[ name ] = value;
        }
    }
    return JSON.stringify( obj );
}

Щоб використовувати так:

var dataToSend = document.querySelector("form").serialize();

Я сподіваюся, що я допоміг.


3
Не буде працювати з прапорцями. Тут потрібно чітко перевірити тип введення.
Адріан Преусс

5

Якщо ви хочете серіалізувати дані про подію. Ось чистий JavaScript-підхід, який я використовую.

// serialize form
var data = {};
var inputs = [].slice.call(e.target.getElementsByTagName('input'));
inputs.forEach(input => {
  data[input.name] = input.value;
});

Дані будуть об’єктом JavaScript вхідних даних.


2
Це повинно працювати на більшості елементів. Однозначно не textarea / select, хоча
jaggedsoft

це slice.call те саме, що Array.from?
користувач1040495

5

Реконструйована версія коду @ SimonSteinberger, що використовує менше змінних та скористається швидкістю forEachциклів (які трохи швидші, ніж fors)

function serialize(form) {
    var result = [];
    if (typeof form === 'object' && form.nodeName === 'FORM')
        Array.prototype.slice.call(form.elements).forEach(function(control) {
            if (
                control.name && 
                !control.disabled && 
                ['file', 'reset', 'submit', 'button'].indexOf(control.type) === -1
            )
                if (control.type === 'select-multiple')
                    Array.prototype.slice.call(control.options).forEach(function(option) {
                        if (option.selected) 
                            result.push(encodeURIComponent(control.name) + '=' + encodeURIComponent(option.value));
                    });
                else if (
                    ['checkbox', 'radio'].indexOf(control.type) === -1 || 
                    control.checked
                ) result.push(encodeURIComponent(control.name) + '=' + encodeURIComponent(control.value));
        });
        return result.join('&').replace(/%20/g, '+');
}

3

Я відремонтував відповіді TibTibs на щось більш чітке для читання. Це трохи довше через ширину 80 символів та кілька коментарів.

Крім того, він ігнорує порожні назви полів та порожні значення.

// Serialize the specified form into a query string.
//
// Returns a blank string if +form+ is not actually a form element.
function $serialize(form, evt) {
  if(typeof(form) !== 'object' && form.nodeName !== "FORM")
    return '';

  var evt    = evt || window.event || { target: null };
  evt.target = evt.target || evt.srcElement || null;
  var field, query = '';

  // Transform a form field into a query-string-friendly
  // serialized form.
  //
  // [NOTE]: Replaces blank spaces from its standard '%20' representation
  //         into the non-standard (though widely used) '+'.
  var encode = function(field, name) {
    if (field.disabled) return '';

    return '&' + (name || field.name) + '=' +
           encodeURIComponent(field.value).replace(/%20/g,'+');
  }

  // Fields without names can't be serialized.
  var hasName = function(el) {
    return (el.name && el.name.length > 0)
  }

  // Ignore the usual suspects: file inputs, reset buttons,
  // buttons that did not submit the form and unchecked
  // radio buttons and checkboxes.
  var ignorableField = function(el, evt) {
    return ((el.type == 'file' || el.type == 'reset')
        || ((el.type == 'submit' || el.type == 'button') && evt.target != el)
        || ((el.type == 'checkbox' || el.type == 'radio') && !el.checked))
  }

  var parseMultiSelect = function(field) {
    var q = '';

    for (var j=field.options.length-1; j>=0; j--) {
      if (field.options[j].selected) {
        q += encode(field.options[j], field.name);
      }
    }

    return q;
  };

  for(i = form.elements.length - 1; i >= 0; i--) {
    field = form.elements[i];

    if (!hasName(field) || field.value == '' || ignorableField(field, evt))
      continue;

    query += (field.type == 'select-multiple') ? parseMultiSelect(field)
                                               : encode(field);
  }

  return (query.length == 0) ? '' : query.substr(1);
}

Я скопіював це безпосередньо у свою програму, і багатофункціональний вибір не працює (значення дублюються)
анастим

@anastymous Дякую за улов, це було виправлено.
Брайан Едмондс

Привіт Брайан, для чого це evt ? і що я повинен пройти за це? Firefox каже мені, що це не визначено.
анастимний

Привіт анастим, ще раз дякую за улов, його слід виправити, змінивши призначення на evt на evt = evt || window.event || { target: null };(як це зробила редакція). Справа за ним - пройти подію, яка спровокувала серіалізацію, якщо така є, наприклад формою подія "подати" або "натиснути" кнопку. Якщо у формі є кілька кнопок для надсилання, потрібно лише врахувати значення кнопки, яка викликала подію, і ігнорувати інші. Я зламав дуже рудиментальний приклад такої поведінки на dump.bedmonds.net/serialize-js
Брайан Едмондс

2
  // supports IE8 and IE9 
  function serialize(form) {
    var inputs = form.elements;
    var array = [];
    for(i=0; i < inputs.length; i++) {
      var inputNameValue = inputs[i].name + '=' + inputs[i].value;
      array.push(inputNameValue);
    }
    return array.join('&');
  }
 //using the serialize function written above
 var form = document.getElementById("form");//get the id of your form. i am assuming the id to be named form.
 var form_data = serialize(form);
 var xhr = new XMLHttpRequest();
 xhr.send(form_data);

 //does not work with IE8 AND IE9
 var form = document.querySelector('form');
 var data = new FormData(form);
 var xhr = new XMLHttpRequest();
 xhr.send(data);

2

Я захопив метод entD () formData з @moison відповіді та з MDN сказано, що:

Метод FormData.entries () повертає ітератор, що дозволяє пройти всі пари ключів / значень, що містяться в цьому об'єкті. Ключ кожної пари - об’єкт USVString; значення або USVString, або Blob.

але єдине питання полягає в тому, що браузер для мобільних пристроїв (андроїд і сафарі не підтримуються) і робочий стіл IE і Safari

але в основному тут мій підхід:

let theForm =  document.getElementById("contact"); 

theForm.onsubmit = function(event) {
    event.preventDefault();

    let rawData = new FormData(theForm);
    let data = {};

   for(let pair of rawData.entries()) {
     data[pair[0]] = pair[1]; 
    }
    let contactData = JSON.stringify(data);
    console.warn(contactData);
    //here you can send a post request with content-type :'application.json'

};

код можна знайти тут


2

Використання функції зменшення JavaScript повинно зробити трюк для всіх браузерів, включаючи IE9>:

Array.prototype.slice.call(form.elements) // convert form elements to array
    .reduce(function(acc,cur){   // reduce 
        var o = {type : cur.type, name : cur.name, value : cur.value}; // get needed keys
        if(['checkbox','radio'].indexOf(cur.type) !==-1){
            o.checked = cur.checked;
        } else if(cur.type === 'select-multiple'){
            o.value=[];
            for(i=0;i<cur.length;i++){
                o.value.push({
                    value : cur.options[i].value,
                    selected : cur.options[i].selected
                });
            }
        }
        acc.push(o);
        return acc;
 },[]);

Живий приклад нижче.


це працює для множинного вибору? Здається, коли я використовую ваш код, він повертає лише перший пункт із значення вибраних кількох варіантів
Зак Сміт,

@ZachSmith Я оновив свою відповідь, щоб включити декілька елементів вибору.
краш-тексxxx

0

Сподіваюся, це спрацює

var serializeForm = (formElement) => {
  const formData = {};
  const inputs = formElement.elements;

  for (let i = 0; i < inputs.length; i++) {
    if(inputs[i].name!=="")
        formData[inputs[i].name] = inputs[i].value;
  }
  return formData;
}

0

Удосконалення відповіді Девіда Лимона.

Це перетворює дані форми в JSON і дозволяє встановити форму з об’єкта даних.

const main = () => {
  const form = document.forms['info'];
  const data = {
    "user_name"       : "John",
    "user_email"      : "john@jonhson.com",
    "user_created"    : "2020-03-24",
    "user_age"        : 42,
    "user_subscribed" : true,
    "user_interests"  : "sports",
    "user_message"    : "Hello My Friend"
  };

  populateForm(form, data);
  updateJsonView(form);
  form.addEventListener('change', (e) => updateJsonView(form));
}

const getFieldValue = (field, opts) => {
  let type = field.getAttribute('type');
  if (type) {
    switch (type) {
      case 'checkbox':
        return field.checked;
      case 'number':
        return field.value.includes('.')
          ? parseFloat(field.value)
          : parseInt(field.value, 10);
    }
  }
  if (opts && opts[field.name] && opts[field.name].type) {
    switch (opts[field.name].type) {
      case 'int':
        return parseInt(field.value, 10);
      case 'float':
        return parseFloat(field.value);
    }
  }
  return field.value;
}

const setFieldValue = (field, value) => {
  let type = field.getAttribute('type');
  if (type) {
    switch (type) {
      case 'checkbox':
        field.checked = value;
        break;
      default:
        field.value = value;
        break;
    }
  } else {
    field.value = value;
  }
}

const extractFormData = (form, opts) => {
  return Array.from(form.elements).reduce((data, element) => {
    return Object.assign(data, { [element.name] : getFieldValue(element, opts) });
  }, {});
};

const populateForm = (form, data) => {
  return Array.from(form.elements).forEach((element) => {
    setFieldValue(element, data[element.name]);
  });
};

const updateJsonView = (form) => {
  let fieldOptions = {};
  let formData = extractFormData(form, fieldOptions);
  let serializedData = JSON.stringify(formData, null, 2);
  document.querySelector('.json-view').textContent = serializedData;
};

main();
.form-field {
  margin-bottom: 0.5em;
}

.form-field label {
  display: inline-block;
  font-weight: bold;
  width: 7em;
  vertical-align: top;
}

.json-view {
  position: absolute;
  top: 0.667em;
  right: 0.667em;
  border: thin solid grey;
  padding: 0.5em;
  white-space: pre;
  font-family: monospace;
  overflow: scroll-y;
  max-height: 100%;
}
<form name="info" action="/my-handling-form-page" method="post">
  <div class="form-field">
    <label for="name">Name:</label>
    <input type="text" id="name" name="user_name">
  </div>
  <div class="form-field">
    <label for="mail">E-mail:</label>
    <input type="email" id="mail" name="user_email">
  </div>
  <div class="form-field">
    <label for="created">Date of Birth:</label>
    <input type="date" id="created" name="user_created">
  </div>
  <div class="form-field">
    <label for="age">Age:</label>
    <input type="number" id="age" name="user_age">
  </div>
  <div class="form-field">
    <label for="subscribe">Subscribe:</label>
    <input type="checkbox" id="subscribe" name="user_subscribed">
  </div>
  <div class="form-field">
    <label for="interests">Interest:</label>
    <select required=""  id="interests" name="user_interests">
      <option value="" selected="selected">- None -</option>
      <option value="drums">Drums</option>
      <option value="js">Javascript</option>
      <option value="sports">Sports</option>
      <option value="trekking">Trekking</option>
    </select>
  </div>
  <div class="form-field">
    <label for="msg">Message:</label>
    <textarea id="msg" name="user_message"></textarea>
  </div>
</form>
<div class="json-view"></div>


0

Це можна зробити за допомогою дуже простої функції наступним чином

function serialize(form) {
        let requestArray = [];
        form.querySelectorAll('[name]').forEach((elem) => {
            requestArray.push(elem.name + '=' + elem.value);
        });
        if(requestArray.length > 0)
            return requestArray.join('&');
        else
            return false;
    }

 serialized = serialize(document.querySelector('form'))
  console.log(serialized);
<form>

  <input type='text' name='fname' value='Johne'/>
  <input type='text' name='lname' value='Doe'/>
  <input type='text' name='contact[]' value='99999999'/>
  <input type='text' name='contact[]' value='34423434345'/>

</form>


0

Ось чистий підхід JavaScript:

var form = document.querySelector('form');
var data = new FormData(form);

  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
       console.log(this.responseText);
    }
  };
  xhttp.open("POST", "<YOUR-URL>", true);
  xhttp.send(data);
}

-1
document.serializeForm = function (selector) {
     var dictionary = {};
     var form = document.querySelector(selector);
     var formdata = new FormData(form);
     var done = false;
     var iterator = formdata.entries();
     do {
         var prop = iterator.next();
         if (prop.done && !prop.value) {
             done = true;
         }
         else {
             dictionary[prop.value[0]] = prop.value[1];
         }

     } while (!done);
     return dictionary;
}

Виглядає акуратно, але він не враховує радіо кнопок або прапорців
Івон Абруроу

-1

Для налагодження це може допомогти вам:

function print_form_data(form) {
    const form_data = new FormData(form);

    for (const item of form_data.entries()) {
        console.log(item);
    }

    return false;
}

-1

Я можу бути божевільним, але я вважаю, що ці відповіді роздуті. Ось моє рішення

function serialiseForm(form) {
  var input = form.getElementsByTagName("input");
  var formData = {};
  for (var i = 0; i < input.length; i++) {
    formData[input[i].name] = input[i].value;
  }
  return formData = JSON.stringify(formData);
}

засновуючи форму для отримання елементів за типом введення, не вдасться select, і все
Зак Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.