Відповіді:
Тимчасово ввімкніть їх.
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');
readonly
замість того, disabled
як згадував Андрій нижче.
Використовуйте лише для введення читання замість вимкнених входів:
<input name='hello_world' type='text' value='hello world' readonly />
Це слід отримати за допомогою serialize ().
Ви можете використовувати проксі-функцію (вона впливає і на $.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);
@ 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();
Спробуйте це:
<input type="checkbox" name="_key" value="value" disabled="" />
<input type="hidden" name="key" value="value"/>
Я бачу кілька обхідних шляхів, але все ще ніхто не пропонував написати власну функцію серіалізації? Ось ви йдете: 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);
}
});
Інвалідні елементи введення не серіалізуються, оскільки "вимкнено" означає, що їх не слід використовувати відповідно до стандарту W3C. jQuery просто дотримується стандарту, хоча деякі браузери цього не роблять. Ви можете обійти це, додавши приховане поле зі значенням, ідентичним для вимкненого поля, або виконавши це через jQuery, приблизно так:
$('#myform').submit(function() {
$(this).children('input[hiddeninputname]').val($(this).children('input:disabled').val());
$.post($(this).attr('url'), $(this).serialize, null, 'html');
});
Очевидно, якщо у вас було більше одного відключеного входу, вам доведеться перебирати відповідні селектори тощо.
Якщо хтось не хоче активувати їх, а потім відключити їх ще раз, ви також можете спробувати це зробити (я змінив його з полів "Інваліди", не вибраних 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");
code
3: {ім'я: undefined, значення: ""} 4: {ім'я: undefined, value: ""}
Щойно над Аароном Хадоном:
Можливо, у вас є щось інше, ніж Input (наприклад, select), тому я змінив
this.find(":input:disabled")
до
this.find(":disabled")
textarea
але не інвалідаinput
..