Функция javascript serializeObject не получает значение флажка

Я использовал функцию "serializeObject" javascript для сериализации форм, проблема в том, что эта функция не получает значение флажка, если флажок не установлен.

HTML:

Javscript:

jQuery.fn.serializeObject = function() {

var self = this,
 json = {},
 push_counters = {},
 patterns = {
 "validate": /^[a-zA-Z][a-zA-Z0-9_]*(?:\[(?:\d*|[a-zA-Z0-9_]+)\])*$/,
 "key": /[a-zA-Z0-9_]+|(?=\[\])/g,
 "push": /^$/,
 "fixed": /^\d+$/,
 "named": /^[a-zA-Z0-9_]+$/
 };


this.build = function(base, key, value){
 base[key] = value;
 return base;
};

this.push_counter = function(key){
 if(push_counters[key] === undefined){
 push_counters[key] = 0;
 }
 return push_counters[key]++;
};

jQuery.each(jQuery(this).serializeArray(), function() {

 // skip invalid keys
 if(!patterns.validate.test(this.name)){
 return;
 }

 var k,
 keys = this.name.match(patterns.key),
 merge = this.value,
 reverse_key = this.name;

 while((k = keys.pop()) !== undefined){

 reverse_key = reverse_key.replace(new RegExp("\\[" + k + "\\]$"), '');

 if(k.match(patterns.push)){
 merge = self.build([], self.push_counter(reverse_key), merge);
 }

 else if(k.match(patterns.fixed)){
 merge = self.build([], k, merge);
 }

 else if(k.match(patterns.named)){
 merge = self.build({}, k, merge);
 }
 }

 json = jQuery.extend(true, json, merge);
});

return json;
};

Как разрешить этой функции получать значение флажка, если флажок установлен или нет?

Заранее спасибо.

1 ответ

Свойство value для флажка всегда будет иметь правдивое значение. Аналогично для ввода type=radio. Если вход одного из этих типов, вам нужно проверить свойство checked.

Вам также нужно будет указать поля для выбора с option:selected

Шины Jquery для упрощения этого предлагают функцию сериализации.

Я не могу решить вашу функцию (если бы вы могли предоставить пример выполнения с помощью фрагмента кода, jsfiddle или codepen, вам может быть повезло больше). Но следующий код может пролить свет. Обратите внимание, как .value всегда возвращает строку, но свойство .checked имеет значение true/false в зависимости от выбора.

let input = document.querySelectorAll('input[type=checkbox]')

console.log(input[0].value)
// "Bike"
console.log(input[1].value)
// "Car"

console.log(input[0].checked)
// false
console.log(input[1].checked)
// true
<form action="/action_page.php" method="get">
  I have a bike
  I have a car
 
</form>

licensed under cc by-sa 3.0 with attribution.