Ich habe mir die jQuery-Dokumente angesehen und denke, wir können dies in einer Zeile mit Selektoren tun :
$("#myForm :input[value!='']").serialize() // does the job!
Natürlich erhält #myForm das Element mit der ID "myForm", aber was mir zunächst weniger klar war, war, dass das Leerzeichen zwischen #myForm und: input benötigt wird, da es sich um den Nachkommenoperator handelt .
: Eingabe entspricht allen Eingabe-, Textbereichs-, Auswahl- und Schaltflächenelementen.
[value! = ''] ist ein Attribut ungleich Filter. Das Seltsame (und Hilfreiche) ist, dass alle: Eingabeelementtypen Wertattribute haben, sogar Auswahl- und Kontrollkästchen usw.
Schließlich, um auch Eingaben zu entfernen, bei denen der Wert '.' War. (wie in der Frage erwähnt):
$("#myForm :input[value!=''][value!='.']").serialize()
In diesem Fall impliziert das Nebeneinander, dh das Platzieren von zwei Attributselektoren nebeneinander , ein UND. Die Verwendung eines Kommas impliziert ein ODER. Entschuldigung, wenn das für CSS-Leute offensichtlich ist!
[value]
Versionen jedem Element dasvalue
vorhandene Attribut zu , einschließlich solcher mit leeren Werten (oder keinen Werten). Dies ist auf einen Fehler in früheren jQuery-Versionen zurückzuführen, der zu einer Inkonsistenz zwischen bestimmten Variationen voninput[value]
und führte:input[value]
. Nehmen Sie zum Beispiel<input value="foo"><input value=""><input value><input>
; Der Fehler ist in dieser Geige dargestellt .$form.find(":input[value]")
- leere Felder wurden nicht ausgewählt. Dies hat nicht funktioniert:$form.find(":input[value!='']")
- Alle Felder wurden ausgewählt. Hoffe das hilft jemandem. (jQuery 2.0.0)$form.find(":input[value]")
arbeitete auch für mich (jQuery 1.11.0)value
Attribut bereits vorhanden war. Es erkannte es nicht anders.value
programmgesteuert festgelegt ist, funktioniert dies nicht (value
existiert nicht als HTML-Attribut, sondern als Datenattribut für die Eingabe). Versuchen Sie in diesen Fällen Folgendes :$('#myForm :input').filter(function(i) { return ($(this).val().length != 0); }).serialize()
. EDIT: Ich habe gerade Richs Antwort auf den gleichen Effekt gesehen.Ich konnte Toms Lösung nicht zum Laufen bringen (?), Aber ich konnte dies
.filter()
mit einer kurzen Funktion tun , um leere Felder zu identifizieren. Ich verwende jQuery 2.1.1.quelle
:input
Selektor wählt grundsätzlich alle Formularsteuerelemente aus. Wählt alle Eingabe-, Textbereichs-, Auswahl- und Schaltflächenelemente aus." QuelleDas funktioniert bei mir:
quelle
!!
tippt alles in bool um, Sie können es in der Konsole versuchen.!!('test')
,!!(5)
,!!(0)
input
Selektors sollte es:input
auchdata = $( "#my_form :input").filter(function () { return $(this).val() != ""; }).serialize();
Sie könnten es mit einem regulären Ausdruck tun ...
Testfälle:
quelle
Ich habe die obige Lösung verwendet, aber für mich haben diese nicht funktioniert. Also habe ich folgenden Code verwendet
Kann für jemanden nützlich sein
quelle
Ich würde mir den Quellcode für jQuery ansehen. In der neuesten Version Zeile 3287.
Ich könnte die Funktionen "serialize2" und "serializeArray2" hinzufügen. Nennen Sie sie natürlich etwas Gemeines.
Oder der bessere Weg wäre, etwas zu schreiben, um die nicht verwendeten Variablen aus serializedFormStr herauszuholen. Ein Regex, der nach = & in der Mitte der Zeichenfolge sucht oder mit = endet. Gibt es Regex-Assistenten?
UPDATE: Ich mag die Antwort von rogeriopvl besser (+1) ... zumal ich momentan keine guten Regex-Tools finde.
quelle
Eine Alternative zu Richs Lösung :
Erklärungen:
.submit()
hängt sich an dassubmit
Ereignis des Formulars ane.preventDefault()
verhindert, dass das Formular gesendet wird.serializeArray()
gibt uns eine Array-Darstellung der Abfragezeichenfolge, die gesendet werden sollte..filter()
Entfernt falsche (einschließlich leerer) Werte in diesem Array.$.param(query)
erstellt eine serialisierte und URL-kompatible Darstellung unseres aktualisierten Arrayswindow.location.href
Senden der Anforderungquelle
Gehen Sie in Coffeescript folgendermaßen vor:
quelle
Vielleicht möchten Sie sich die .each () -Jquery-Funktion ansehen, mit der Sie jedes Element eines Selektors durchlaufen können. Auf diese Weise können Sie jedes Eingabefeld überprüfen und feststellen, ob es leer ist oder nicht, und es dann aus dem Formular entfernen using element.remove (). Danach können Sie das Formular serialisieren.
quelle