web-dev-qa-db-ja.com

$ .serialize()で無効化された:input要素を考慮に入れるにはどうすればよいですか?

デフォルトでは、無効な入力要素は$.serialize()によって無視されるようです。回避策はありますか?

127
fms

一時的に有効にします。

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

無効な入力の代わりに読み取り専用入力を使用します。

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

これは、serialize()によって取得されるはずです。

88
Andrew

プロキシ関数を使用できます($.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);
10
Krzysiek

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

これを試して:

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

無効化された入力要素は、W3C規格ごとに「無効化された」要素を使用すべきではないため、シリアル化されません。一部のブラウザはサポートしていませんが、jQueryは標準に従っています。この問題を回避するには、無効なフィールドと同じ値を持つ非表示フィールドを追加するか、jQueryを介して次のようにします。

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

明らかに、複数の無効化された入力がある場合、一致するセレクタなどを反復処理する必要があります。

2
Jason Lewis

私はいくつかの回避策を見ることができますが、それでも誰もあなた自身のシリアライズ関数を書くことを提案しませんか?ここに行きます: 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
David162795

誰かがそれらをアクティブにしたくない場合、再度無効にする場合は、これを行うこともできます(、プラグインの使用から通常の機能の使用まで):

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

アーロン・フードンのすぐ上:

たぶん、入力以外のもの(selectなど)があるので、私は変更しました

this.find(":input:disabled")

this.find(":disabled")
0
Carl Verret