Câu trả lời:
Tạm thời kích hoạt chúng.
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
thay vì disabled
như được đề cập bởi Andrew dưới đây.
Sử dụng đầu vào chỉ đọc thay vì đầu vào bị vô hiệu hóa:
<input name='hello_world' type='text' value='hello world' readonly />
Điều này sẽ được chọn bằng cách tuần tự hóa ().
Bạn có thể sử dụng hàm proxy (nó ảnh hưởng đến cả hai $.serializeArray()
và $.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 cung cấp câu trả lời cốt lõi. Đóng góp của tôi ở đây chỉ là một tính độc đáo của jQuery bằng cách thêm một hàm vào nó:
/**
* 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;
};
Ví dụ sử dụng:
$("form").serializeIncludeDisabled();
Thử cái này:
<input type="checkbox" name="_key" value="value" disabled="" />
<input type="hidden" name="key" value="value"/>
Tôi có thể thấy một vài cách giải quyết, nhưng vẫn không có ai đề nghị viết chức năng tuần tự hóa của riêng bạn? Tại đây bạn đi: 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);
}
});
Các yếu tố đầu vào bị vô hiệu hóa không được tuần tự hóa vì 'bị vô hiệu hóa' có nghĩa là chúng không nên được sử dụng, theo tiêu chuẩn W3C. jQuery chỉ tuân theo tiêu chuẩn, mặc dù một số trình duyệt không có. Bạn có thể giải quyết vấn đề này bằng cách thêm một trường ẩn có giá trị giống hệt với trường bị vô hiệu hóa hoặc bằng cách thực hiện điều này thông qua jQuery, đại loại như thế này:
$('#myform').submit(function() {
$(this).children('input[hiddeninputname]').val($(this).children('input:disabled').val());
$.post($(this).attr('url'), $(this).serialize, null, 'html');
});
Rõ ràng, nếu bạn có nhiều hơn một đầu vào bị vô hiệu hóa, bạn sẽ phải lặp lại qua các bộ chọn phù hợp, v.v.
Trong trường hợp ai đó không muốn kích hoạt chúng, sau đó vô hiệu hóa chúng một lần nữa, bạn cũng có thể thử thực hiện điều này (tôi đã sửa đổi nó từ các trường bị vô hiệu hóa không được serializeArray chọn , từ sử dụng plugin sang sử dụng chức năng bình thường):
function getcomment(item)
{
var data = $(item).serializeArray();
$(':disabled[name]',item).each(function(){
data.push({name: item.name,value: $(item).val()});
});
return data;
}
Vì vậy, bạn có thể gọi họ như thế này:
getcomment("#formsp .disabledfield");
code
3: {name: không xác định, giá trị: ""} 4: {name: không xác định, giá trị: ""}
textarea
nhưng không phải là người khuyết tậtinput
..