Как сделать так, чтобы $ .serialize () учитывал те отключенные элементы: input? - PullRequest
125 голосов
/ 20 января 2011

Кажется, по умолчанию отключенные элементы ввода игнорируются $.serialize().Есть ли обходной путь?

Ответы [ 9 ]

211 голосов
/ 20 января 2011

Временно включить их.

var myform = $('#myform');

 // Find disabled inputs, and remove the "disabled" attribute
var disabled = myform.find(':input:disabled').removeAttr('disabled');

 // serialize the form
var serialized = myform.serialize();

 // re-disabled the set of inputs that you previously enabled
disabled.attr('disabled','disabled');
88 голосов
/ 14 марта 2013

Используйте входы только для чтения вместо отключенных входов:

<input name='hello_world' type='text' value='hello world' readonly />

Это должно быть получено с помощью serialize ().

9 голосов
/ 04 сентября 2013

Вы можете использовать функцию прокси (она влияет как на $.serializeArray(), так и на $.serialize()):

(function($){
    var proxy = $.fn.serializeArray;
    $.fn.serializeArray = function(){
        var inputs = this.find(':disabled');
        inputs.prop('disabled', false);
        var serialized = proxy.apply( this, arguments );
        inputs.prop('disabled', true);
        return serialized;
    };
})(jQuery);
7 голосов
/ 17 августа 2017

@ user113716 предоставил основной ответ.Мой вклад здесь - это просто jQuery, добавив в него функцию:

/**
 * Alternative method to serialize a form with disabled inputs
 */
$.fn.serializeIncludeDisabled = function () {
    let disabled = this.find(":input:disabled").removeAttr("disabled");
    let serialized = this.serialize();
    disabled.attr("disabled", "disabled");
    return serialized;
};

Пример использования:

$("form").serializeIncludeDisabled();
2 голосов
/ 22 октября 2015

Я вижу несколько обходных путей, но до сих пор никто не предложил написать свою собственную функцию сериализации?Вот, пожалуйста: https://jsfiddle.net/Lnag9kbc/

var data = [];

// here, we will find all inputs (including textareas, selects etc)
// to find just disabled, add ":disabled" to find()
$("#myform").find(':input').each(function(){
    var name = $(this).attr('name');
    var val = $(this).val();
    //is name defined?
    if(typeof name !== typeof undefined && name !== false && typeof val !== typeof undefined)
    {
        //checkboxes needs to be checked:
        if( !$(this).is("input[type=checkbox]") || $(this).prop('checked'))
            data += (data==""?"":"&")+encodeURIComponent(name)+"="+encodeURIComponent(val);
    }
});
2 голосов
/ 17 октября 2014

Попробуйте это:

<input type="checkbox" name="_key" value="value"  disabled="" />
<input type="hidden" name="key" value="value"/>
2 голосов
/ 20 января 2011

Отключенные элементы ввода не сериализуются, потому что «отключен» означает, что они не должны использоваться, согласно стандарту W3C. jQuery просто соблюдает стандарт, хотя некоторые браузеры этого не делают. Вы можете обойти это, добавив скрытое поле со значением, идентичным отключенному полю, или сделав это через jQuery, что-то вроде этого:

$('#myform').submit(function() {
  $(this).children('input[hiddeninputname]').val($(this).children('input:disabled').val());
  $.post($(this).attr('url'), $(this).serialize, null, 'html');
});

Очевидно, что если бы у вас было более одного отключенного ввода, вам пришлось бы перебирать соответствующие селекторы и т. Д.

1 голос
/ 28 марта 2018

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

function getcomment(item)
{
  var data = $(item).serializeArray();
  $(':disabled[name]',item).each(function(){
    data.push({name: item.name,value: $(item).val()});
  });
  return data;
}

Таким образом, вы можете вызывать их так:

getcomment("#formsp .disabledfield");
0 голосов
/ 06 февраля 2019

Сразу Аарон Худон:

Возможно, у вас есть что-то еще, кроме Input (например, select), поэтому я изменил

this.find(":input:disabled")

на

this.find(":disabled")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...