web-dev-qa-db-fra.com

Exclure certaines entrées sur sérialiser

J'essaie d'exclure une entrée par son nom (c'est une entrée cachée contenant mon nonce)

La question suivante est presque ce que je cherche:

Comment utiliser form.serialize de jQuery mais exclure les champs vides

mais j'ai 2 questions sur la solution là-bas qui stipule que pour sérialiser les données de formulaire sauf pour les entrées vides et les entrées où la valeur = "."

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

tout d'abord, je ne peux pas le faire fonctionner avec la variable jquery "this"

$('#ofform').live('submit', function(e) {
    e.preventDefault();
    var serializedReturn = $(this :input[name!='security']).serialize();        
});

Et deuxièmement, j'ai un formulaire séparé avec l'identifiant ofform-reset et si j'utilise:

var serializedReturn = $(#ofform :input[name!='security']).serialize(); 

il prend les entrées dans l'autre # formulaire de réinitialisation de formulaire, ET/OU entrées qui ne sont pas enfermées dans une balise. 

trouvé la réponse dans l'une de mes questions précédentes. balise invalide du style:

<form id="ofform">
 <div id="toolbar">
 <button id="save">Save</button>
</form>
<form id="ofform-reset">
 <button id="reset">Reset</button>
</form>
</div>

maintenant pour comprendre comment utiliser 2 boutons différents pour contrôler le même formulaire

37
helgatheviking

Vous n'avez pas besoin du : car l'entrée est un élément et non un pseudo sélecteur. Deuxièmement, vous ne pouvez pas utiliser un objet et une chaîne de texte comme celle-ci dans votre sélecteur. Vous devez plutôt fournir cela comme argument de la portée de $():

$('#ofform').live('submit', function(e) {
    e.preventDefault();
    var serializedReturn = $('input[name!=security]', this).serialize();        
});
41
prodigitalson

Tout d’abord, vous devez invoquer la méthode .find() comme:

var serializedReturn = $(this).find('input[name!=security]').serialize(); 

Sinon, la chaîne complète irait dans le moteur de requête CSS (Sizzle).

Deuxièmement:

J'ai un autre formulaire avec l'id de ofform-reset et si j'utilise:

Vous devez changer cela. C'est un balisage invalide d'avoir plusieurs identifiants. Si je vous ai mal compris, la première solution pourrait également vous aider, en invoquant également la méthode .find():

var serializedReturn = $('#ofform').find('input[name!=security]').serialize(); 
12
jAndy

Dans ma situation, cela a bien fonctionné:

$("fieldset").not(".tasks-container").serialize()
7
user1429980

Je ne suis pas satisfait de 'input[name!=security]' car il exclut tous les autres types d'entrée tels que select, .. Vous pouvez les ajouter manuellement, mais cette liste ne cesse de croître avec les nouvelles balises HTML. Donc, à chaque nouvelle balise, votre code est à nouveau cassé.

Voici ma solution:

$form.find(':not(input[name=draft])').serialize()

ou 

$('form[name=expenses] :not(input[name=draft])').serialize()

L'espace est très important dans le deuxième exemple.

4
VarunAgw

Vous pouvez filtrer le tableau de résultats

var ignoreFields = ["_csrf"];

$('form')
 .serializeArray()
 .filter(function(val){
    return ignoreFields.indexOf(val.name) === -1;
 });

Ou variante plus courte

$('form').serializeArray().filter(val => ignoreFields.indexOf(val.name) === -1)
0
Dimmduh