Получение данных из HTML-форм в Javascript всегда создает строки?

Я использую Javascript для перехвата отправки HTML-формы:

var form_api = $("#apiForm");
$(form_api).submit(function(event) {
   /* stop form from submitting normally */
   event.preventDefault();

   /* Get input values from form */
   var formData = prepFormData("#apiForm");
}

Однако, когда я конвертирую данные в объект (я хочу использовать jQuery для передачи этого в конечную точку), все свойства объекта являются строками.

function prepFormData(formSelector){
   var form_api = $(formSelector);

   // Serialize the form data as a PlainObject.
   var formData = $(form_api).serializeArray().reduce(function (obj, item) {
      obj[item.name] = item.value;
      return obj;
   }, {});
}

Почему он всегда производит строки? Вместо этого я хотел бы следующее поведение:

  • <input type = "text"> должен выдавать NULL, если ничего не было введено.
  • <input type = "number"> должен выдавать Int при вводе значения.
Поведение ключевого слова "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
0
1 067
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это нормальное поведение JS. номер типа и текст предназначены для проверки внутри ввода для браузеров. Они не определяют тип данных значения внутри них. По умолчанию это строки. Вы можете выполнять преобразования для вашего использования. Текстовое поле возвращает пустую строку, потому что по умолчанию это пустая строка, а не нуль.

Есть ли способ увидеть, какой тип поля ввода дает мне каждую пару ключ/значение, чтобы я мог выполнить соответствующие преобразования в prepFormData?

GoldenJoe 29.01.2019 07:36
Ответ принят как подходящий

Вам нужно проанализировать ввод в соответствии с вашими потребностями. Каждое значение формы в HTML по своей сути является строкой.

Атрибут type сообщает браузеру, какое поле отображать, а не тип данных значения. Возьмем, к примеру:

<input type = "hidden" value = "1">

HTML и javascript не могут вывести информацию о типе данных с hidden, это может быть строка, это может быть целое число.

number не менее проблематичен, почему по умолчанию int, как насчет двойников и других типов чисел?

В моем примере выше обратите внимание, что значение заключено в кавычки, обозначающие строку. (Кавычки необязательны, но рекомендуются, но ничего не делают с типом данных.)

Чтобы на самом деле решить вашу проблему, я бы подумал о добавлении атрибут данных к вашим полям, скажем, data-type для хранения типа данных, к которому вы хотите привести свое значение.

Вот краткий пример:

var form_api = $("#apiForm");
$(form_api).submit(function(event) {
   /* stop form from submitting normally */
   event.preventDefault();

   /* Get input values from form */
  var formData = prepFormData("#apiForm");  
  console.info(formData);
});


function prepFormData(formSelector){
 var form_api = $(formSelector);

   // Serialize the form data as a PlainObject.
   var formData = $(form_api).serializeArray().reduce(function (obj, item) {
      var tempValue = null;
      if (item.value !== "") {
        //Get data type of current field
        var dataType = $(form_api).find("[name = " + item.name + "]").data("type");
        
        if (dataType === undefined) {
          dataType = "text";
        }
        
        //Extend this based on the other data types you need   
        switch(dataType) {
          case "text" :
            tempValue = item.value;
            break;
         case "int" :
            tempValue = parseInt(item.value, 10);
            break;
         case "float" : 
            tempValue = parseFloat(item.value);
            break;         
         //Fall back for no data type defined, eg the select in this example   
         default :
            tempValue = item.value;
            break;
        }
      }
      obj[item.name] = tempValue;
      return obj;
   }, {});
   
   return formData;
}
label {display:block; margin-bottom:5px;}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<form id = "apiForm" method = "get" action = "">
  <label>Name <input type = "text" data-type = "text" name = "Name"></label>
  <label>Integer <input type = "number" data-type = "int" name = "Integer"></label>
  <label>Float <input type = "number" step = "0.1" data-type = "float" name = "Float"></label>
  <fieldset>
    <legend>Age Range</legend>
    <label>&lt;18 <input type = "radio" data-type = "text" name = "AgeRange" value = "<18"></label>
    <label>&gt;18 <input type = "radio" data-type = "text" name = "AgeRange" value = ">18"></label>
  </fieldset>
  <label>Country
  <select name = "country">
    <option value = "usa">USA</option>
    <option value = "aus">Australia</option>
    <option value = "other">Other</option>
  </select>
  </label>
  <label>Product
    <select name = "ProductId" data-type = "int">
      <option value = "1">Apple</option>
      <option value = "2">Orange</option>
      <option value = "11">Pear</option>
      <option value = "110">Pineapple</option>
    </select>
  </label>
  <input type = "hidden" data-type = "text" name = "HiddenText" value = "">
  <input type = "submit">
</form>

Вы можете просто добавить в поле любой атрибут данных? Это было бы полезно. Как бы вы получили его при создании PlainObject?

GoldenJoe 29.01.2019 07:37

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