jQuery sérialiser n'enregistre pas les cases à cocher
Je suis en utilisant jQuery.sérialiser pour récupérer tous les champs de données dans un formulaire.
Mon problème est qu'il n'a pas retriev des cases à cocher n'est pas cochée.
Il comprend ceci:
<input type="checkbox" id="event_allDay" name="event_allDay" class="checkbox" checked="checked" />
mais pas cette
<input type="checkbox" id="event_allDay" name="event_allDay" class="checkbox" />
Comment puis-je obtenir des "valeurs" de cases à cocher n'est pas cochée?
- Ce que nous faisons en ASP Net est d'avoir caché entrée:
<input type="checkbox" id="event_allDay" name="event_allDay" class="checkbox" checked="checked" Value="On" />
<input type="hidden" name="event_allDay" Value="Off" />
de Cette façon, si elle ne l'est pas, il prendra la valeur de l'cachés
Vous devez vous connecter pour publier un commentaire.
jQuery
serialize
imite de près comment un formulaire standard serait sérialisé par le navigateur avant d'être ajouté à la chaîne de requête ou de corps POST dans la demande. Décoché les cases ne sont pas compris par le navigateur, qui fait sens vraiment parce qu'ils ont une valeur booléenne de l'état -- ils sont sélectionnés par l'utilisateur (inclus) ou non sélectionné par l'utilisateur (non-inclus).Si vous avez besoin d'être dans le sérialisé, vous devez vous demander "pourquoi? pourquoi ne pas vérifier son existence dans les données?".
Garder à l'esprit que si la façon de JavaScript sérialise les données de formulaire se comporte différemment de la façon dont le navigateur ne puis vous êtes en éliminant toute possibilité de dégradation gracieuse pour votre formulaire. Si vous devez absolument le faire, il suffit d'utiliser un
<select>
boîte avec Oui/Non comme des options. Au moins, puis, les utilisateurs avec JS désactivé ne sont pas éloignés de votre site et vous n'allez pas contre le comportement défini dans la spécification HTML.Que j'ai vu cet employés sur certains sites, dans le passé, et j'ai toujours pensé à moi-même, "pourquoi ne pas simplement utiliser une case à cocher"?
De construire sur azatoth le génie de répondre, j'ai un peu plus longs que pour mon scénario:
serializeArray()
pas seulementserialize()
Vous n'avez pas, comme sérialiser est destiné à être utilisé comme une chaîne de requête, et dans ce contexte, pas cochée signifie qu'il n'est pas dans la chaîne de requête à tous.
Si vous voulez vraiment obtenir les valeurs de décoché les cases à cocher, utilisation: (non testé bien sûr)
si vous voulez ajouter la désérialisation des cases à cocher pour votre chaîne de requête, ajoutez les lignes suivantes à votre jquery soumettre fonction:
jQuery sérialiser obtient la valeur de l'attribut d'intrants.
Maintenant comment faire pour obtenir une case à cocher ou un bouton radio pour travailler? Si vous définissez l'événement click de la case à cocher ou un bouton-radio 0 ou 1, vous serez en mesure de voir les changements.
et aussi quand vous le souhaitez définir la case avec le statut vérifié par ex. php
text
, ou unselect
) à laserialize()
fonction en donnant la case à cocher d'unvalue
de propriété - qui garde en synchronisation avec le statut vérifié. Et il est plus élégant que la réponse choisie.Voici une autre solution qui s'étend de la "serializeArray" méthode (tout en préservant le comportement d'origine).
var _serializeArray = $ji.fn.serializeArray;
Ce sera effectivement ajouter "true" ou "false" boolean résultats, mais si vous le préférez, vous pouvez utiliser le bouton "1" et "0" respectivement, par la modification de la valeur
value: $item.is(":checked") ? 1 : 0
.Utilisation
Comme d'habitude, l'appel à la méthode de votre formulaire:
$form.serialize()
ou$form.serializeArray()
. Ce qui se passe est queserialize
fait usage deserializeArray
de toute façon, de sorte que vous obtenir les résultats appropriés (bien que différent format) avec n'importe quelle méthode que vous appelez.Une technique que j'ai utilisé dans mes propres systèmes, et qui, je crois, est employée par des jambes de force, est à inclure...
...immédiatement à côté de la case à cocher dans le cadre de mon formulaire de création de la logique.
Cela me permet de reconstruire des cases à cocher qui ont servi dans la forme, mais n'est pas sélectionnée, avec un tout petit peu de logique supplémentaire pour faire la diff de ce qui était servi et ce qui a été vérifié, vous avez ceux qui ont été décochée. La présentation est également la même dans le contenu, indépendamment de savoir si vous êtes en utilisant le HTML ou AJAX style de présentation.
En fonction de la technologie que vous utilisez côté serveur, vous pouvez utiliser cette syntaxe...
...pour le rendre facile à saisir ces valeurs dans une liste.
Vous pouvez appeler
handleInputs()
ajouter dans votre fonction envoyer avant ajaxIl est parfaitement travailler
L'une des raisons pour l'utilisation de la non-standard case de sérialisation qui n'est pas abordé dans la question ou dans le courant de réponses est de seulement deserialize (changement) des champs qui ont été explicitement spécifié dans les données sérialisées - par exemple, lorsque vous utilisez jquery, la sérialisation et la désérialisation vers/à partir d'un cookie pour enregistrer et charger des prefererences.
Thomas Danemar mis en œuvre une modification à la norme
serialize()
méthode pour éventuellement prendre uncheckboxesAsBools
option: http://tdanemar.wordpress.com/2010/08/24/jquery-serialize-method-and-checkboxes/ - ce qui est similaire à la mise en œuvre énumérés ci-dessus par @mydoghasworms, mais également intégrée dans la norme sérialiser.J'ai copié sur Github dans le cas où quelqu'un a des améliorations à faire à tout moment: https://gist.github.com/1572512
En outre, le "jquery.désérialiser" plugin sera désormais correctement désérialiser case à cocher valeurs sérialisées avec
checkboxesAsBools
, et d'ignorer les cases qui ne sont pas mentionnés dans les données sérialisées: https://github.com/itsadok/jquery.deserializeL'astuce consiste à intercepter le post de formulaire et modifier les cases cachées des champs de saisie.
Exemple: La Plaine De Soumettre
Exemple: AJAX
Vous avez besoin de sauter à travers quelques cerceaux si vous validez le formulaire via ajax ne pas mettre à jour l'INTERFACE utilisateur.
Ceci permettra de définir votre forme de case à cocher valeurs booléennes à l'aide de leurs bagages de l'état.
Le cadre que nous utilisons crée deux entrées avec le même nom, ce qui conduit à un comportement inattendu lors de la sérialisation de la forme. Je voudrais obtenir chaque case de la valeur analysée comme un tableau à deux éléments avec les valeurs de chaîne. Selon les données de la carte côté serveur, vous pouvez obtenir des résultats inattendus.
serializeObject()
: benalman.com/projects/jquery-misc-plugins/#serializeobjectPour ASP.NET MVC, nous avons réussi à enregistrer un formulaire avec cases via un AJAX POST avec le suivant, qui est une combinaison de plusieurs méthodes référencées dans ce post, y compris @Jecoms suggestion:
À l'aide des champs comme suggéré par Andy n'est pas nécessairement la meilleure option pour l'expérience utilisateur, car il a besoin de deux clics de souris au lieu d'un.
En outre, un "Select" utilise beaucoup plus d'espace dans l'INTERFACE utilisateur que d'une case à cocher.
Ash réponse est une solution simple, mais ne fonctionne pas dans le cas de champs du tableau.
Dans mon contexte, j'ai une longueur variable de formulaire, qui contient les lignes de l'affichage d'un mélange de texte et les champs case à cocher :
Pour le décodage des données publiées, le ordre des éléments du tableau est important. Juste l'ajout de la non-vérifié les éléments de Jquery sérialiser ne conserve pas l'ordre des éléments de ligne.
Voici une solution proposée, basée sur les Cendres de la réponse :
J'ai eu un problème similaire et la suite m'a permis de recueillir toutes les forme de valeurs d'entrée et coché/décoché les cases à cocher.
Cet exemple suppose que vous voulez afficher un formulaire de retour par
serialize
et passerializeArray
, et qu'un décoché la case signifiefalse
:not(:checked)
sélecteurparfois incontrôlée des moyens autres valeurs, par exemple vérifié pourrait dire oui décochée pas ou 0,1 etc cela dépend du sens que vous voulez donner.. donc peut être un autre état, en plus de "cochée signifie qu'il n'est pas dans la chaîne de requête à tous les"
"Il serait beaucoup plus facile à stocker des informations dans la base de données. Parce qu'alors le nombre de champs de Sérialiser serait égal au nombre de champs dans la table. Maintenant, je dois contrll ceux qui sont absents", vous êtes en droit c'est mon problème aussi... donc il semble que je dois vérifier pour cette inexistants valeur....
mais peut-être que cela pourrait être une solution?
http://tdanemar.wordpress.com/2010/08/24/jquery-serialize-method-and-checkboxes/
<select>
avec oui/non options, au lieu de créer quelque chose qui va à l'encontre de la façon dont la spécification HTML définit un formulaire pour être soumis.simplement ajouter un caché d'entrée
n'a pas besoin de valeur,je l'ai testé, cela fonctionne pour moi
Vous Pouvez Obtenir les entrées la valeur avec jquery sérialiser
HTML:
Juste pour étoffer la réponse(s) ci-dessus, dans mon cas, je l'envoi d'un oui/non contre un ID unique sérialisé à mon backend attraper.
Je activez la case à cocher les éléments à contenir l'ID d'une colonne de base de données, aka (cochée par défaut):
(Laravel De La Lame)
Quand j'ai fait ma présentation, j'ai saisi les données avec:
(jQuery)
Pour ceux qui utilisent le
serialize()
fonction:J'ai utilisé de cette façon, et d'obtenir les valeurs "0" ou si coché la case "1". Ce disant que si case de saisie du nom n'est pas exister dans sérialisé
form_data
alors cela signifie qu'il n'est pas cochée, puis d'ajouter de la valeur à zéro (form_data += '&' + name + '=0'
), mais si l'option est cochéeserialize()
fonction ajoute automatiquement.Essayez ceci:
$(':input[type="checkbox"]:checked').map(function(){return this.valeur}).get();
Je poste la solution qui a fonctionné pour moi !