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ドキュメントを調べてきましたが、セレクターを使用してこれを1行で行うことができると思います:

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

明らかに#myFormは、ID「あるmyForm」を持つ要素を取得しますが、どのような最初に私にはそれほど明らかであったことはということでした空白文字が #myFormとの間で必要とされている:それは、入力子孫演算子。

:inputは、すべてのinput、textarea、select、およびbutton要素に一致します。

[value!= '']は、フィルターと等しくない属性です。奇妙な(そして役立つ)ことは、すべての:input要素タイプが、selectやチェックボックスなどでさえvalue属性を持っているということです。

最後に、値が「。」だった入力も削除します。(質問で述べたように):

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

この場合、並列、つまり2つの属性セレクターを隣り合わせに配置することは、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 2013

4
私にとって、これはうまくいきました:$form.find(":input[value]")-空のフィールドは選択されませんでした。これは機能しませんでした:$form.find(":input[value!='']")-すべてのフィールドが選択されました。それが誰かを助けることを願っています。(jQuery 2.0.0)
Ryan Wheale 2014

1
$form.find(":input[value]")また私のために働いた(jQuery 1.11.0)
GSTAR 2014

value属性がすでに存在する場合にのみ機能しました。それ以外の場合は認識しませんでした。
スターコーン2015

1
valueがプログラムで設定されている場合、これは機能しません(valueHTML属性としては存在しませんが、入力のデータ属性としては機能します)。そのような場合は、これを試してください$('#myForm :input').filter(function(i) { return ($(this).val().length != 0); }).serialize()。編集:ちょうど同じ効果に対するリッチの答えを見ました。
Fateh Khalsa 2017

54

トムのソリューションを機能させることができませんでしたが(?)、.filter()空のフィールドを識別するための短い関数を使用してこれを行うことができました。私はjQuery 2.1.1を使用しています。

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

2
承認された回答を得ることができませんでしたが、これはうまくいきました!ありがとう!
bfritz 2017

:inputセレクターは基本的にすべてのフォームコントロールを選択します。すべての入力、テキストエリア、選択、およびボタン要素を選択します。」出典
Dinei 2017

ええ、トムのは壊れています。あなたのはそのフィドルでの私の試みよりもきれいです。Up'd
ハッシュブラウン、

11

これは私にとってはうまくいきます:

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

まあ、コールバックはtrueを!!返す値を渡して、ブールに何かを再入力します。コンソールで試すことができます。!!('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(/&$ /、 '')を追加します
Tom Viner

15
正規表現が悪化しないことは問題ありません。
マイケルクック

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

リッチのソリューションの代替:

$('#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
これに関する唯一の問題は、ページが送信される直前に、コントロールからの空が消えることです。名前を ""に設定すると、シリアライズで無視されます。
トムヴィナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.