Подтвердить что ты не робот

JQuery serialize не регистрирует флажки

Я использую jQuery.serialize для извлечения всех полей данных в форме.

Моя проблема в том, что он не извлекает флажки, которые не проверяются.

Он включает в себя следующее:

<input type="checkbox" id="event_allDay" name="event_allDay" class="checkbox" checked="checked" />

но не этот

<input type="checkbox" id="event_allDay" name="event_allDay" class="checkbox" />

Как я могу получить "значения" флажков, которые не отмечены?

4b9b3361

Ответ 1

jQuery serialize близко имитирует, как стандартная форма будет сериализована браузером, прежде чем присоединяться к строке запроса или телу POST в запросе. Непроверенные флажки не включены браузером, что имеет смысл на самом деле, потому что они имеют логическое состояние - они либо выбраны пользователем (включены), либо не выбраны пользователем (не включены).

Если вам нужно, чтобы он был в сериализованном виде, вы должны спросить себя: "почему? почему бы просто не проверить его существование в данных?".

Имейте в виду, что если способ преобразования данных в формате JavaScript ведет себя по-разному, как это делает браузер, то вы устраняете любую вероятность изящного деградации для вашей формы. Если вам все еще нужно это сделать, просто используйте поле <select> с параметрами Yes/No as. По крайней мере, пользователи с отключенным JS не отчуждаются от вашего сайта, и вы не собираетесь противоречить определенному поведению в спецификации HTML.

<select id="event_allDay" name="event_allDay">
   <option value="0" selected>No</option>
   <option value="1">Yes</option>
</select>

Я видел, что это использовалось на некоторых сайтах в прошлом и всегда думало про себя: "Почему бы им просто не использовать флажок"?

Ответ 2

Чтобы построить ответ гениального азатота, я немного расширил его для своего сценария:

    /* Get input values from form */
    values = jQuery("#myform").serializeArray();

    /* Because serializeArray() ignores unset checkboxes and radio buttons: */
    values = values.concat(
            jQuery('#myform input[type=checkbox]:not(:checked)').map(
                    function() {
                        return {"name": this.name, "value": false}
                    }).get()
    );

Ответ 3

У вас нет, поскольку serialize предназначен для использования в качестве строки запроса, и в этом контексте unchecked означает, что он не находится в querystring вообще.

Если вы действительно хотите получить значения отмеченных флажков, используйте: (untested off course)

var arr_unchecked_values = $('input[type=checkbox]:not(:checked)').map(function(){return this.value}).get();

Ответ 4

если вы хотите добавить неизолированные флажки в строку запроса, добавьте следующее в функцию отправки jquery:

var moreinfo = '';

$('input[type=checkbox]').each(function() {     
    if (!this.checked) {
        moreinfo += '&'+this.name+'=0';
    }
});

Ответ 5

Здесь другое решение, которое расширяет метод serializeArray (при сохранении исходного поведения).

//Store the reference to the original method:

var _serializeArray = $ji.fn.serializeArray;

//Now extend it with newer "unchecked checkbox" functionality:
$ji.fn.extend({
    serializeArray: function () {
        //Important: Get the results as you normally would...
        var results = _serializeArray.call(this);

        //Now, find all the checkboxes and append their "checked" state to the results.
        this.find('input[type=checkbox]').each(function (id, item) {
            var $item = $ji(item);
            var item_value = $item.is(":checked") ? 1 : 0;
            var item_name = $item.attr('name');
            var result_index = null;
            results.each(function (data, index) {
                if (data.name == item_name) {
                    result_index = index;
                }
            });

            if (result_index != null) {
                // FOUND replace previous value
                results[result_index].value = item_value;
            }
            else {
                // NO value has been found add new one
                results.push({name: item_name, value: item_value});
            }
        });
        return results;
    }
});

Это фактически добавит "истинные" или "ложные" логические результаты, но если вы предпочитаете, вы можете использовать "1" и "0" соответственно, изменив значение на value: $item.is(":checked") ? 1 : 0.

Использование

Как обычно, вызовите метод в вашей форме: $form.serialize() или $form.serializeArray(). Случается, что serialize в любом случае использует serializeArray, поэтому вы получаете правильные результаты (хотя и в другом формате) с помощью любого метода, который вы вызываете.

Ответ 6

Метод, который я использовал в своих системах, и который, я считаю, используется Struts, должен включать...

<input type="hidden" name="_fieldname" value="fieldvalue"/> 

... непосредственно рядом с флажком как часть моей логики создания формы.

Это позволяет мне реконструировать, какие флажки были поданы в форме, но не выбраны, с небольшим количеством дополнительной логики, чтобы выполнить diff, что было подано и что было проверено, у вас есть те, которые были сняты. Представление также одинаков в содержании независимо от того, используете ли вы HTML или AJAX-стиль.

В зависимости от технологии, используемой на стороне сервера, вы можете использовать этот синтаксис...

<input type="hidden" name="_fieldname[]" value="fieldvalue"/>

..., чтобы упростить захват этих значений в виде списка.

Ответ 7

jQuery serialize получает атрибут value входов.

Теперь, как установить флажок и переключатель на работу? Если вы установите событие щелчка на флажке или радиокнопке 0 или 1, вы сможете увидеть изменения.

$( "#myform input[type='checkbox']" ).on( "click", function(){
     if ($(this).prop('checked')){
          $(this).attr('value', 1);
     } else {
          $(this).attr('value', 0);
     }
 }); 

 values = $("#myform").serializeArray();

а также когда вы хотите установить флажок с отмеченным статусом, например. PHP

<input type='checkbox' value="<?php echo $product['check']; ?>" checked="<?php echo $product['check']; ?>" />

Ответ 8

Одной из причин использования нестандартной сериализации checkbox, которая не рассматривается в вопросе или в текущих ответах, является только десериализация (изменение) полей, которые явно указаны в сериализованных данных - например когда вы используете сериализацию jquery и десериализацию в/из cookie для сохранения и загрузки предпочтений.

Thomas Danemar внедрил модификацию стандартного метода serialize() для необязательного выбора checkboxesAsBools: http://tdanemar.wordpress.com/2010/08/24/jquery-serialize-method-and-checkboxes/ - это похоже к реализации, перечисленной выше @mydoghasworms, но также интегрированной в стандартную сериализацию.

Я скопировал его в Github, если у кого-то есть улучшения в любой момент: https://gist.github.com/1572512

Кроме того, плагин jquery.deserialize теперь корректно десериализует значения флажка, сериализованные с помощью checkboxesAsBools, и игнорирует флажки, которые не упоминаются в сериализованных данных: https://github.com/itsadok/jquery.deserialize

Ответ 9

var checkboxes = $('#myform').find('input[type="checkbox"]');
$.each( checkboxes, function( key, value ) {
    if (value.checked === false) {
        value.value = 0;
    } else {
        value.value = 1;
    }
    $(value).attr('type', 'hidden');
});
$('#myform').serialize();

Ответ 10

Трюк состоит в том, чтобы перехватить сообщение формы и поменять флажки на скрытые поля ввода.

Пример: Обычный Отправить

$('form').on("submit", function (e) {
    //find the checkboxes
    var $checkboxes = $(this).find('input[type=checkbox]');

    //loop through the checkboxes and change to hidden fields
    $checkboxes.each(function() {
        if ($(this)[0].checked) {
            $(this).attr('type', 'hidden');
            $(this).val(1);
        } else {
            $(this).attr('type', 'hidden');
            $(this).val(0);
        }
    });
});

Пример: AJAX

Вам нужно пройти еще несколько обручей, если вы отправляете форму через ajax, чтобы не обновлять пользовательский интерфейс.

$('form').on("submit", function (e) {
    e.preventDefault();

    //clone the form, we don't want this to impact the ui
    var $form = $('form').clone();

    //find the checkboxes
    var $checkboxes = $form.find('input[type=checkbox]');

    //loop through the checkboxes and change to hidden fields
    $checkboxes.each(function() {
        if ($(this)[0].checked) {
            $(this).attr('type', 'hidden');
            $(this).val(1);
        } else {
            $(this).attr('type', 'hidden');
            $(this).val(0);
        }
    });

    $.post("/your/path", $form.serialize());

Ответ 11

Это установит флажковые значения формы в booleans, используя их проверенное состояние.

var form = $('#myForm');
var data = form.serializeObject();

$('#myForm input[type=checkbox]').each(function() { data[this.name] = this.checked; });

Используемая среда создает два входа с тем же именем, что приводит к неожиданному поведению при сериализации формы. Я бы получил каждое значение checkbox, проанализированное как двухэлементный массив со строковыми значениями. В зависимости от того, как вы сопоставляете данные на стороне сервера, вы можете получить непредвиденные результаты.

Ответ 12

Для ASP.NET MVC мы успешно сохраняем форму с флажками с помощью AJAX POST со следующим, что представляет собой комбинацию несколько методов, упомянутых в этом сообщении, включая @Jecoms предложение:

var form = $('#myForm');
// Serialize the form into a JavaScript object using the jQuery.serializeObject plugin
// https://plugins.jquery.com/serializeObject/
var data = form.serializeObject();
// Change the submitted value of checkboxes to the value of the checked property
$('#myForm input[type=checkbox]').each( function () { data[this.name] = this.checked; } );
// For a MVC controller, convert the JS object back into a query string using jQuery.param function
data = $.param(data);
// Perform AJAX POST with the form data
$.ajax({
    async: true,
    url: 'mvcActionMethodURL',
    type: 'POST',
    data: data,
    success: function (data, textStatus, xhr) {

    },
    error: function (xhr, status, error) {

    }
});

Ответ 13

Вы можете вызвать handleInputs() добавить в функцию отправки до ajax

function handleInputs(){
    $('input[type=checkbox]').each(function() {     
        if (!this.checked) {
            $(this).attr("value","0");
        }else{
            $(this).attr("value","1");
        }
    });
}

Это отлично работает

Ответ 14

Использование полей выбора, предложенных Энди, не обязательно является наилучшим вариантом для пользователя, поскольку для него требуется два щелчка мыши, а не один.

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

Явный ответ - простое решение, но не работает в случае полей массива.

В моем контексте у меня есть форма переменной длины, которая содержит строки, отображающие сочетание текста и полей флажка:

<input type="checkbox" value="1" name="thisIsAChkArray[]"/> 
<input type="text" value="" name="thisIsATxtArray[]"/>

Для декодирования опубликованных данных важно порядок элементов массива. Просто добавление не проверенных элементов в обычный сериализатор Jquery не поддерживает порядок элементов строки.

Вот предлагаемое решение, основанное на ответе Эша:

(function($) {
  $.fn.serializeWithChkBox = function() {
    // perform a serialize form the non-checkbox fields
    var values = $(this).find('select')
                        .add(  $(this).find('input[type!=checkbox]') )
                        .serialize();
    // add values for checked and unchecked checkboxes fields
    $(this).find('input[type=checkbox]').each(function() {
      var chkVal = $(this).is(':checked') ? $(this).val() : "0";
      values += "&" + $(this).attr('name') + "=" + chkVal;
    });
    return values;
  }
})(jQuery);

Ответ 15

У меня была аналогичная проблема, и следующее позволило мне собрать все входные значения формы и отмеченные/снятые флажки.

var serialized = this.$('#myform input').map(function() {
return { name: this.name, id: this.id, value: this.checked ? "checked" : "false" };
});

Ответ 16

В этом примере предполагается, что вы хотите отправить форму обратно через serialize, а не serializeArray, а флажок без отметки означает false:

var form = $(formSelector);
var postData = form.serialize();

var checkBoxData = form.find('input[type=checkbox]:not(:checked)').map(function () {
    return encodeURIComponent(this.name) + '=' + false;
}).get().join('&');

if (checkBoxData) {
    postData += "&" + checkBoxData;
}

$.post(action, postData);

Ответ 17

иногда не проверяется, означает, что другие значения, например checked, могут означать, что yes unchecked no или 0,1 и т.д., это зависит от значения, которое вы хотите дать.. так что может быть другое состояние, кроме "непроверенных означает, что он не в querystring вообще",

"Было бы намного проще хранить информацию в БД, потому что тогда число полей из Сериализатора равнялось количеству полей в таблице. Теперь мне нужно пропустить, какие из них отсутствуют", вы правы, это мой проблема тоже... поэтому мне кажется, что я должен проверить это несуществующее значение....

но, возможно, это может быть решение? http://tdanemar.wordpress.com/2010/08/24/jquery-serialize-method-and-checkboxes/

Ответ 18

просто добавьте скрытый ввод

<input type="hidden" name="your_specific_name">

не требуется значение, я тестировал это для меня.

Ответ 19

Вы можете получить значения входов с сериализацией jquery

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="checkbox" id="event_allDay" name="event_allDay" checked="checked" onchange="isChecked(this)" value="" />
<script>
    function isChecked(element) {
        $(element).val($(element).is(':checked').toString());
    }
    isChecked('#event_allDay');
</script>

Ответ 20

Чтобы развернуть ответ (-ы) выше, в моем случае мне потребовалась отправка да/нет по одному идентификатору, сериализованному для моего бэкэнда.

Я установил элементы флажка, чтобы содержать идентификатор конкретного столбца базы данных, иначе (по умолчанию проверено):

(Ларавельский клинок)

<div class="checkbox">
    <label>
        <input type="checkbox" value="{{ $heading->id }}" checked> {{ $heading->name }}
    </label>
</div>

Когда я сделал свое выражение, я взял данные с помощью:

(JQuery)

let form = $('#formID input[type="checkbox"]').map(function() {
                return { id: this.value, value: this.checked ? 1 : 0 };
           }).get();

var data = JSON.stringify(form);
$.post( "/your/endpoint", data );

Ответ 21

Для тех, кто использует функцию serialize():

(function ($) {
    var serialize = $.fn.serialize;

    $.fn.serialize = function () {
        let values = serialize.call(this);
        let checkboxes = [];

        checkboxes = checkboxes.concat(
            $('input[type=checkbox]:not(:checked)', this).map(
            function () {
                return this.name + '=false';
            }).get()
        );

        if(checkboxes.length > 0)
            values = checkboxes.join('&') + '&' + values;

        return values;
    };
})(jQuery);

Ответ 22

Я использовал этот способ и получаю значения "0" или если отмечен "1". Это говорит о том, что если флажок не установлен, то добавьте значение как ноль (form_data += '&' + name + '=0'), но если установлен флажок, функция serialize() автоматически добавит его. form_data - это данные, которые уже получают функцией serialize(). Но флажки значения добавляются позже. Это не лучшее решение, но решило мою проблему с флажками.

    $.each($("#form_id input[type='checkbox']"), function(){
        var name = $(this).attr('name');
        if(form_data.indexOf(name)===-1)form_data += '&' + name + '=0';
    });

Ответ 23

Попробуйте следующее:

$(': input [type = "checkbox" ]: checked'). map (function() {return this.value}). get();

Ответ 24

Я разместил решение, которое сработало для меня!

var form = $('#checkboxList input[type="checkbox"]').map(function() {
               return { name: this.name, value: this.checked ? this.value : "false" };
            }).get();

var data = JSON.stringify(form);

data value is : "[{"name":"cb1","value":"false"},{"name":"cb2","value":"true"},{"name":"cb3","value":"false"},{"name":"cb4","value":"true"}]"