jQuery의 form.serialize를 사용하지만 빈 필드를 제외하는 방법


107

GET을 통해 제출하는 여러 텍스트 입력 및 드롭 다운이있는 검색 양식이 있습니다. 검색이 수행 될 때 쿼리 문자열에서 빈 필드를 제거하여 더 깨끗한 검색 URL을 갖고 싶습니다.

var form = $("form");  
var serializedFormStr = form.serialize();  
// I'd like to remove inputs where value is '' or '.' here
window.location.href = '/search?' + serializedFormStr

jQuery를 사용하여 어떻게 할 수 있는지 아십니까?

답변:


167

jQuery 문서를 살펴 보았고 선택기를 사용하여 한 줄로 할 수 있다고 생각합니다 .

$("#myForm :input[value!='']").serialize() // does the job!

분명히 #myForm은 ID가 "myForm"인 요소를 가져 오지만 처음 에는 하위 연산자 이므로 #myForm과 : input 사이에 공백 문자 가 필요하다는 것이 처음에는 명확 하지 않았습니다 .

: input 은 모든 입력, 텍스트 영역, 선택 및 단추 요소와 일치합니다.

[value! = ''] 는 필터가 같지 않은 속성입니다. 이상하고 유용한 점은 모든 : input 요소 유형에는 선택 및 확인란 등의 값 속성이 있다는 것입니다.

마지막으로 값이 '.'인 입력도 제거합니다. (질문에서 언급했듯이) :

$("#myForm :input[value!=''][value!='.']").serialize()

이 경우 병치, 즉 서로 옆에 두 개의 속성 선택기를 배치 하는 것은 AND를 의미합니다. 쉼표 사용 은 OR을 의미합니다. 그것이 CSS 사람들에게 명백하다면 죄송합니다!


3
@Mvision, 이것은이 답변에 작지만 중요한 누락이 있기 때문입니다. jQuery 1.8 및 이전 버전의 일반 / 순수 CSS 선택기의 경우 값이 비어 있거나없는 경우를 포함하여 존재[value] 하는 속성 value 있는 모든 요소와 일치 합니다. 이는 및의 특정 변형 사이에 불일치를 생성 한 이전 jQuery 버전의 버그 때문 입니다. 예를 들어, ; 버그는 이 바이올린에 설명되어 있습니다. input[value]:input[value]<input value="foo"><input value=""><input value><input>
Noyo

4
나를 위해 이것은 작동했습니다 $form.find(":input[value]").-빈 필드가 선택되지 않았습니다. 작동하지 않음 : $form.find(":input[value!='']")-모든 필드가 선택되었습니다. 누군가에게 도움이되기를 바랍니다. (jQuery 2.0.0)
Ryan Wheale 2014-06-06

1
$form.find(":input[value]")또한 나를 위해 일했습니다 (jQuery 1.11.0)
GSTAR

value속성이 이미있는 경우에만 작동했습니다 . 그렇지 않으면 인식하지 못했습니다.
starcorn

1
value가 프로그래밍 방식으로 설정된 일부 경우에는 작동하지 않습니다 ( valueHTML 속성으로 존재하지 않지만 입력의 데이터 속성으로 사용됨). 이 경우 다음을 시도하십시오 $('#myForm :input').filter(function(i) { return ($(this).val().length != 0); }).serialize().. 편집 : 같은 효과에 대한 Rich의 대답을 보았습니다.
Fateh Khalsa

54

Tom의 솔루션을 작동시킬 수 없었지만 (?) .filter()짧은 함수를 사용하여 빈 필드를 식별 할 수있었습니다 . jQuery 2.1.1을 사용하고 있습니다.

var formData = $("#formid :input")
    .filter(function(index, element) {
        return $(element).val() != '';
    })
    .serialize();

2
작동에 대한 승인 된 답변을 얻을 수 없었지만 이것은 훌륭하게 작동했습니다! 감사!
bfritz

내 질문에 대답 : " :input선택기는 기본적으로 모든 양식 컨트롤을 선택합니다. 모든 입력, 텍스트 영역, 선택 및 단추 요소를 선택합니다." 출처
Dinei

그래, 톰은 고장났어 . 너의 것 역시 그 바이올린에서 나의 시도보다 깨끗하다. Up'd
Hashbrown

11

이것은 나를 위해 작동합니다.

data = $( "#my_form input").filter(function () {
        return !!this.value;
    }).serialize();

글쎄, 콜백은 true를 반환하는 값을 전달 !!하고 bool에 무엇이든 다시 입력합니다 . 콘솔에서 시도해 볼 수 있습니다. !!('test'), !!(5),!!(0)
Aiphee

2
그리고 대신 input선택,이 있어야 :input등을 선택, 포함
Aiphee

이 변경 사항을 제안합니다.data = $( "#my_form :input").filter(function () { return $(this).val() != ""; }).serialize();
Mahoor13

9

정규식으로 할 수 있습니다 ...

var orig = $('#myForm').serialize();
var withoutEmpties = orig.replace(/[^&]+=\.?(?:&|$)/g, '')

테스트 사례 :

orig = "a=&b=.&c=&d=.&e=";
new => ""

orig = "a=&b=bbb&c=.&d=ddd&e=";
new => "b=bbb&d=ddd&"  // dunno if that trailing & is a problem or not

.replace (/[^&]+=\.?(& | $) / g, '')는 두 경우 모두에 적용됩니다. 하지만 .replace를 추가 할 것 (/ & $ /, '') 후행 및 제거합니다
톰 Viner

15
정규식이 더 나빠질 수 없다는 문제는 없습니다.
Michael Cook

3

위의 솔루션을 사용했지만 저에게는 효과가 없었습니다. 그래서 다음 코드를 사용했습니다.

$('#searchform').submit(function(){

            var serializedData = $(this).serializeArray();
            var query_str = '';

            $.each(serializedData, function(i,data){
                if($.trim(data['value'])){
                    query_str += (query_str == '') ? '?' + data['name'] + '=' + data['value'] : '&' + data['name'] + '=' + data['value'];
                }
            });
            console.log(query_str);
            return false;
        });

누군가에게 유용 할 수 있습니다.


1

jQuery의 소스 코드를 살펴 보겠습니다. 최신 버전 라인 3287.

"serialize2"및 "serializeArray2"함수를 추가 할 수 있습니다. 물론 의미있는 이름을 지정하십시오.

또는 더 좋은 방법은 serializedFormStr에서 사용되지 않는 변수를 가져 오는 무언가를 작성하는 것입니다. 중간 문자열에서 = &를 찾거나 = 정규식 마법사로 끝나는 일부 정규식?

업데이트 : 나는 rogeriopvl의 대답을 더 좋아합니다 (+1) ... 특히 지금 좋은 정규식 도구를 찾을 수 없기 때문에.


1

Rich의 솔루션에 대한 대안 :

$('#form').submit(function (e) {
  e.preventDefault();

  var query = $(this).serializeArray().filter(function (i) {
    return i.value;
  });

   window.location.href = $(this).attr('action') + (query ? '?' + $.param(query) : '');
});

설명 :

  • .submit()양식의 submit이벤트에 연결
  • e.preventDefault() 양식 제출을 방지합니다.
  • .serializeArray() 전송 될 쿼리 문자열의 배열 표현을 제공합니다.
  • .filter() 해당 배열에서 거짓 (빈 포함) 값을 제거합니다.
  • $.param(query) 업데이트 된 배열의 직렬화 된 URL 호환 표현을 생성합니다.
  • window.location.href요청 을 보낼 값 설정

0

coffeescript에서 다음을 수행하십시오.

serialized_form = $(_.filter($(context).find("form.params input"), (x) -> $(x).val() != '')).serialize()

-1

선택기의 모든 요소를 ​​반복 할 수있는 .each () jquery 함수를보고 싶을 수 있습니다. 이렇게하면 각 입력 필드를 확인하고 비어 있는지 여부를 확인한 다음 양식에서 제거 할 수 있습니다. element.remove () 사용. 그 후에 양식을 직렬화 할 수 있습니다.


1
유일한 문제는 페이지가 제출되기 직전에 컨트롤에서 비어있는 내용이 사라지는 것을 볼 수 있다는 것입니다. 이름을 ""로 설정하는 것이 더 좋으므로 serialize가이를 무시합니다.
Tom Viner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.