Làm cách nào để tôi tạo $ .serialize () có tính đến những yếu tố bị vô hiệu hóa: các yếu tố đầu vào?


135

Dường như các yếu tố đầu vào bị tắt mặc định bị bỏ qua bởi $.serialize(). Có một cách giải quyết?


Nó thậm chí còn kỳ lạ hơn, bởi vì bạn có thể tuần tự hóa một người khuyết tật textareanhưng không phải là người khuyết tật input..
daVe

Câu trả lời:


233

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');

26
đáng xem xét readonlythay vì disablednhư được đề cập bởi Andrew dưới đây.
andilabs

93

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 ().


Tuyệt vời, chỉ là một lưu ý: nút gửi vẫn có thể nhấp khi chỉ đọc.
André Chalella

3
bị vô hiệu hóa ngăn chặn việc tuần tự hóa, nhưng chỉ ngăn chặn xác nhận
Jeff Lowery

11

Bạn có thể sử dụng hàm proxy (nó ảnh hưởng đến cả hai $.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);

Giải pháp tốt nhất, hoạt động cho lựa chọn, hộp kiểm, radio, đầu vào bị ẩn và bị vô hiệu hóa
Plasebo

9

@ 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();

4

Thử cái này:

<input type="checkbox" name="_key" value="value"  disabled="" />
<input type="hidden" name="key" value="value"/>

Bạn có thể vui lòng giải thích thêm một chút và giải thích cho OP tại sao điều này hoạt động?
Willem Mulder

Tôi có thể giải thích nó cho bạn. Nếu bạn vẫn muốn có một trường đầu vào bị vô hiệu hóa (vì bất kỳ lý do gì), nhưng bạn cũng muốn gửi tên đầu vào bằng phương thức serialize (). Sau đó, thay vào đó, bạn có thể sử dụng trường nhập liệu ẩn (có cùng giá trị với trường nhập bị vô hiệu hóa của bạn), mà tuần tự hóa () không bỏ qua. Và sau đó bạn cũng có thể giữ trường đầu vào bị vô hiệu hóa của bạn để hiển thị.
superkytoz

3

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);
    }
});

2

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.


1

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");

1
Tôi đã thử chức năng của bạn và nó không tạo ra tên hoặc giá trị phần tử. Xem ví dụ dưới đây; code 3: {name: không xác định, giá trị: ""} 4: {name: không xác định, giá trị: ""}
blackmambo

0

Chỉ hơn Aaron Hudon:

Có lẽ bạn đã có một cái gì đó khác ngoài Đầu vào (như chọn), vì vậy tôi đã thay đổi

this.find(":input:disabled")

đến

this.find(":disabled")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.