111 votes

Comment faire pour utiliser jQuery.sérialiser, mais excluent les champs vides

J'ai un formulaire de recherche avec un certain nombre de saisies de texte et des listes déroulantes qui soumet par l'intermédiaire d'un GET. J'aimerais avoir un nettoyeur url de recherche, 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 le faire à l'aide de jQuery?

175voto

Tom Viner Points 2323

J'ai été à la recherche sur le jQuery docs et je pense que nous pouvons le faire en une seule ligne à l'aide de sélecteurs:

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

Évidemment #myForm obtient l'élément avec l'id "myForm" mais ce qui était moins évident pour moi était d'abord que le caractère espace est nécessaire entre #myForm et :entrée, comme c'est le descendant de l'opérateur.

entrée : correspond à tous les input, textarea, select et bouton d'éléments.

[value!="] est un attribut de ne pas l'égalité de filtre. L'étrange (et utile), c'est que tout :l'entrée de l'élément de types ont de la valeur des attributs de même sélectionne et des cases à cocher, etc.

Enfin, également, de supprimer des entrées lorsque la valeur a été '.' (comme mentionné dans la question):

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

Dans ce cas, la juxtaposition, c'est à dire de placer deux sélecteur d'attribut à côté de l'autre, implique une ET. À l'aide d'une virgule implique un OU. Désolé si c'est évident pour CSS personnes!

11voto

nickf Points 185423

Vous pourriez le faire avec une regex...

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

Des cas de Test:

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

3voto

Rajan Rawal Points 1569

J'ai utilisé la solution ci-dessus mais pour moi, ceux qui n'ont pas travaillé. J'ai donc utilisé le code suivant

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

Peut être utile pour quelqu'un

1voto

BuddyJoe Points 15690

Je regarde le code source de jQuery. Dans la version en ligne 3287.

Je pourrais ajouter dans un "serialize2" et "serializeArray2" des fonctions. bien sûr, le nom de quelque chose meaniful.

Ou la meilleure façon serait d'écrire quelque chose à tirer le solde non utilisé de vars de la serializedFormStr. Certains regex qui recherche =& au milieu de chaîne ou se terminant dans l' = Tout regex assistants autour?

Mise à JOUR: J'aime rogeriopvl la réponse de mieux (+1)... d'autant plus que je ne peux pas trouver une bonne regex outils de la droite maintenant.

-1voto

rogeriopvl Points 9619

Vous voudrez peut-être regarder à l' .chacun() fonction jquery qui vous permet de parcourir chaque élément d'un sélecteur, donc, de cette façon, vous pouvez aller vérifier chaque champ de saisie et de voir si elle est vide ou pas et puis l'enlever de la forme à l'aide de l'élément.supprimer(). Après cela, vous pouvez sérialiser la forme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X