$ .Serialize () işlevini devre dışı bırakılan giriş öğelerini nasıl dikkate alırım?


135

Varsayılan olarak devre dışı bırakılan giriş öğeleri tarafından yok sayılır $.serialize(). Bir çözüm var mı?


Hatta bir garip, çünkü bir engelli seri hale getirebilirsiniz textareaama bir engelli değil input..
daVe

Yanıtlar:


233

Geçici olarak etkinleştirin.

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
dikkate değer readonlyyerine disabledaşağıda Andrew tarafından belirtildiği gibi.
andilabs

93

Devre dışı girişler yerine salt okunur girişleri kullanın:

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

Bu serialize () tarafından alınmalıdır.


Harika, sadece bir not: Gönder düğmesi salt okunur olduğunda yine de tıklanabilir.
André Chalella

3
devre dışı bırakıldığında serileştirme önlenir, ancak salt okunurluk doğrulanır
Jeff Lowery

12

Bir proxy işlevini (hem etkiler kullanabilirsiniz $.serializeArray()ve $.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);

En iyi çözüm, seçme, onay kutusu, radyo, gizli ve devre dışı girişler için çalışıyor
Plasebo

9

@ user113716 temel cevabı verdi. Buradaki katkım, ona bir işlev ekleyerek sadece bir jQuery nicety:

/**
 * 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;
};

Örnek kullanım:

$("form").serializeIncludeDisabled();

4

Bunu dene:

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

Lütfen biraz daha ayrıntı verebilir ve OP'ye bunun neden işe yaradığını açıklayabilir misiniz?
Willem Mulder

Bunu senin için açıklayabilirim. Hala devre dışı bir giriş alanı (herhangi bir nedenle) istiyorsanız, ancak giriş adını serialize () yöntemiyle de göndermek istiyorsanız. Daha sonra bunun yerine serialize () 'ın göz ardı etmediği gizli bir giriş alanı (devre dışı giriş alanınızla aynı değere sahip) kullanabilirsiniz. Ardından, görünürlük için devre dışı giriş alanınızı da saklayabilirsiniz.
superkytoz

3

Birkaç geçici çözüm görebiliyorum, ama yine de kimse kendi serileştirme işlevinizi yazmayı önermedi? İşte başlıyoruz: 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

Devre dışı bırakılan giriş öğeleri serileştirilmez, çünkü 'devre dışı', W3C standardına göre kullanılmamaları gerektiği anlamına gelir. jQuery, bazı tarayıcılarda bulunmasa bile standartlara uymaktadır. Devre dışı bırakılan alanla aynı değere sahip gizli bir alan ekleyerek veya bunu jQuery aracılığıyla aşağıdaki gibi bir şey yaparak bu sorunu çözebilirsiniz:

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

Açıkçası, birden fazla devre dışı girişiniz varsa, eşleşen seçiciler vb. Üzerinden yineleme yapmanız gerekir.


1

Birisi onları etkinleştirmek istemezse, sonra tekrar devre dışı bırakırsanız, bunu da deneyebilirsiniz (bunu, serializeArray tarafından alınmayan Devre dışı alanlardan , bir eklenti kullanmaktan normal bir işlevi kullanmaya kadar değiştirdim):

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

Böylece onlara şöyle diyebilirsiniz:

getcomment("#formsp .disabledfield");

1
Ben senin fonksiyonunu denedim ve öğeleri adı veya değeri üretmez. Aşağıdaki örneğe bakın; code 3: {ad: undefined, değer: ""} 4: {name: undefined, değer: ""}
blackmambo

0

Aaron Hudon'un hemen üzerinde:

Belki de Input'dan (select gibi) başka bir şey var, bu yüzden değiştirdim

this.find(":input:disabled")

için

this.find(":disabled")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.