Frage

Ich habe ein Suchformular mit einer Reihe von Texteingaben & Drop Tiefen, die über eine GET einreicht. Ich mag eine sauberere Suche URL haben, indem sie die leeren Felder aus der Abfragezeichenfolgeflag zu entfernen, wenn eine Suche durchgeführt wird.

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

Jede Idee, wie kann ich dies mit jQuery tun?

War es hilfreich?

Lösung

Ich habe über die jQuery docs suchen und ich denke, dass wir dies mit in einer Zeile tun < a href = "http://docs.jquery.com/Selectors" rel = "noreferrer"> Selektoren :

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

Offensichtlich bekommt #myForm das Element mit der ID „myForm“ aber was war weniger offensichtlich für mich an war zunächst, dass die Leerzeichen ist erforderlich zwischen #myForm und: Eingang, da es das ist Nachkomme Operator.

: input alle Eingabe übereinstimmt, Textbereich, wählen und Taste Elemente.

[value! = ''] ist ein Attribut nicht gleich Filter. Die seltsame (und hilfreich) ist, dass alle. Eingabe Elementtypen haben Wert Attribute selbst wählt und Kontrollkästchen usw.

Schließlich auch Eingänge zu entfernen, wo der Wert war ‚‘ (Wie in der Frage erwähnt):

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

In diesem Fall Nebeneinander, das heißt Anordnen von zwei Attributselektoren nebeneinander , impliziert eine UND . ein Komma Verwendung impliziert eine OR. Sorry, wenn das CSS Menschen offensichtlich ist!

Andere Tipps

war ich nicht in der Lage Tom Lösung zu arbeiten (?), Aber ich war in der Lage, dies mit .filter() mit einer kurzen Funktion zu tun, um leere Felder zu identifizieren. Ich bin mit jQuery 2.1.1.

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

Dies funktioniert für mich:

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

Man könnte es mit einem regex tun ...

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

Die Testfälle:

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

Ich habe obige Lösung verwendet, aber für mich diejenigen, die nicht gearbeitet haben. So habe ich folgenden Code verwendet,

$('#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;
        });

Kann jemand nützlich sein

würde ich auf den Quellcode für jQuery aussehen. In der neuesten Version Zeile 3287.

Ich könnte in einem "serialize2" und "serializeArray2" Funktionen hinzufügen. natürlich nennen sie etwas meaniful.

oder der bessere Weg wäre, etwas zu schreiben, die nicht verwendeten Vars aus dem serializedFormStr zu ziehen. Einige regex, die in = für = & Mitte String oder Ende aussieht Irgendwelche regex Assistenten um?

UPDATE: Ich mag rogeriopvl Antwort besser (1) ... zumal ich keine guten regex Tools jetzt finden können.

In Coffeescript, dies zu tun:

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

Sie können an der .each () jQuery-Funktion aussehen wollen, dass Sie durch jedes Element eines Wähler iterieren ermöglicht, so dass diese Art und Weise können Sie jedes Eingabefeld gehen und sehen, ob es leer ist oder nicht, und dann abziehen aus der Form unter Verwendung von element.remove (). Danach können Sie das Formular serialisiert werden können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top