J'ai un formulaire de recherche avec un certain nombre d'entrées de texte et de listes déroulantes qui se soumettent via un GET. Je voudrais avoir une URL de recherche plus propre en supprimant les champs vides de la chaîne de requête lorsqu'une recherche est effectuée.
var form = $("form");
var serializedFormStr = form.serialize();
// I'd like to remove inputs where value is '' or '.' here
window.location.href = '/search?' + serializedFormStr
Une idée de comment je peux faire cela en utilisant jQuery?
la source
[value]
correspond à tout élément avec l'attributvalue
présent , y compris ceux avec des valeurs vides (ou aucune) valeur. Cela est dû à un bogue dans les versions antérieures de jQuery qui a créé une incohérence entre certaines variantes deinput[value]
et:input[value]
. Prenez, par exemple<input value="foo"><input value=""><input value><input>
,; le bug est illustré dans ce violon .$form.find(":input[value]")
- les champs vides n'ont pas été sélectionnés. Cela n'a pas fonctionné:$form.find(":input[value!='']")
- tous les champs ont été sélectionnés. J'espère que cela aide quelqu'un. (jQuery 2.0.0)$form.find(":input[value]")
a également travaillé pour moi (jQuery 1.11.0)value
attribut était déjà là. Il ne l'a pas reconnu autrement.value
est défini par programme, cela ne fonctionnera pas (value
n'existera pas en tant qu'attribut HTML, mais en tant qu'attribut de données sur l'entrée). Dans ces cas, essayez ceci:$('#myForm :input').filter(function(i) { return ($(this).val().length != 0); }).serialize()
. EDIT: Je viens de voir la réponse de Rich dans le même sens.Je n'ai pas pu faire fonctionner la solution de Tom (?), Mais j'ai pu le faire en utilisant
.filter()
une fonction courte pour identifier les champs vides. J'utilise jQuery 2.1.1.la source
:input
sélecteur sélectionne essentiellement tous les contrôles de formulaire. Sélectionne tous les éléments d'entrée, de zone de texte, de sélection et de bouton." sourceCela fonctionne pour moi:
la source
!!
retape tout ce qui est booléen, vous pouvez essayer dans la console.!!('test')
,!!(5)
,!!(0)
input
sélecteur, il devrait y avoir:input
pour inclure des sélections, etc.data = $( "#my_form :input").filter(function () { return $(this).val() != ""; }).serialize();
Vous pouvez le faire avec une regex ...
Cas de test:
la source
J'ai utilisé la solution ci-dessus mais pour moi, cela n'a pas fonctionné. J'ai donc utilisé le code suivant
Peut être utile pour quelqu'un
la source
Je regarderais le code source de jQuery. Dans la dernière ligne de version 3287.
Je pourrais ajouter des fonctions "serialize2" et "serializeArray2". bien sûr, nommez-les quelque chose de méchant.
Ou le meilleur moyen serait d'écrire quelque chose pour extraire les variables inutilisées de serializedFormStr. Une expression régulière qui recherche = & au milieu de la chaîne ou se terminant par = Des assistants d'expression régulière?
MISE À JOUR: J'aime mieux la réponse de rogeriopvl (+1) ... d'autant plus que je ne trouve pas de bons outils de regex pour le moment.
la source
Une alternative à la solution de Rich :
Explications:
.submit()
s'accroche à l'submit
événement du formulairee.preventDefault()
empêche le formulaire de se soumettre.serializeArray()
nous donne une représentation sous forme de tableau de la chaîne de requête qui allait être envoyée..filter()
supprime les valeurs fausses (y compris vides) dans ce tableau.$.param(query)
crée une représentation sérialisée et conforme à l'URL de notre tableau mis à jourwindow.location.href
envoyer la demandela source
Dans coffeescript, procédez comme suit:
la source
Vous voudrez peut-être regarder la fonction jquery .each (), qui vous permet de parcourir chaque élément d'un sélecteur, de cette façon, vous pouvez vérifier chaque champ de saisie et voir s'il est vide ou non, puis le supprimer du formulaire en utilisant element.remove (). Après cela, vous pouvez sérialiser le formulaire.
la source