programing

비활성화된 입력 요소를 고려하여 $.serialize()를 만드는 방법은 무엇입니까?

batch 2023. 9. 8. 21:18
반응형

비활성화된 입력 요소를 고려하여 $.serialize()를 만드는 방법은 무엇입니까?

기본적으로 비활성화된 입력 요소는 다음과 같이 무시됩니다.$.serialize(). 해결할 방법이 있습니까?

일시적으로 활성화합니다.

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

비활성화된 입력 대신 읽기 전용 입력 사용:

<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 nice에 함수를 추가한 것입니다.

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

둘 이상의 입력이 비활성화된 경우 일치하는 선택기 등을 반복해야 합니다.

다른 사용자가 활성화하지 않으려는 경우 다시 비활성화할 수 있습니다(직렬화에 의해 선택되지 않은 비활성화 필드에서 수정했습니다).플러그인 사용에서 일반 기능 사용에 이르기까지 배열:

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

애런 휴든 바로 앞:

입력(예: select)이 아닌 다른 것이 있을 수도 있습니다. 그래서 변경했습니다.

this.find(":input:disabled")

로.

this.find(":disabled")

언급URL : https://stackoverflow.com/questions/4748655/how-do-i-make-serialize-take-into-account-those-disabled-input-elements

반응형