J'utilise jQuery Serialize pour sérialiser mes éléments de formulaire et je voudrais les désérialiser. Malheureusement, vous ne trouvez aucun désérialiseur jQuery fonctionnel, des suggestions?
La moitié de jQuery Serialize est param () , donc la moitié de quelque chose qui désérialise une chaîne de requête va être un deparam. Malheureusement, je n'ai pas pu trouver un bon deparam autonome. Pour l'instant, je recommande d'obtenir la bibliothèque jQuery BBQ et de l'utiliser. Si vous n'avez pas besoin des autres éléments, vous pouvez les supprimer. J'ai lu quelque part que Ben Alman (cowboy) avait prévu d'extraire le deparam dans son propre module.
Pour le reste de la désérialisation, vous aurez juste besoin de parcourir l'objet renvoyé par deparam et pour chaque paire de clés et de valeurs de l'objet, sélectionnez l'élément de formulaire en fonction de la clé et définissez la valeur des éléments de formulaire sur la valeur.
J'ai écrit une version de jQuery.deserialize qui prend en charge les données sérialisées générées à partir des fonctions serialize, serializeArray et serializeObject. Il prend également en charge tous les types d'éléments de formulaire, y compris les cases à cocher et les boutons radio.
Essaye ça:
function deparam(query) {
var pairs, i, keyValuePair, key, value, map = {};
// remove leading question mark if its there
if (query.slice(0, 1) === '?') {
query = query.slice(1);
}
if (query !== '') {
pairs = query.split('&');
for (i = 0; i < pairs.length; i += 1) {
keyValuePair = pairs[i].split('=');
key = decodeURIComponent(keyValuePair[0]);
value = (keyValuePair.length > 1) ? decodeURIComponent(keyValuePair[1]) : undefined;
map[key] = value;
}
}
return map;
}
J'étais très intéressé à essayer JQuery.deserialize, mais il ne semblait pas du tout gérer les cases à cocher, donc cela ne répondait pas à mes besoins. J'ai donc écrit le mien. Cela s'est avéré plus facile que je ne le pensais, car la fonction jQuery val () fait la plupart du travail:
jQuery.fn.deserialize = function (data) {
var f = this,
map = {},
find = function (selector) { return f.is("form") ? f.find(selector) : f.filter(selector); };
//Get map of values
jQuery.each(data.split("&"), function () {
var nv = this.split("="),
n = decodeURIComponent(nv[0]),
v = nv.length > 1 ? decodeURIComponent(nv[1]) : null;
if (!(n in map)) {
map[n] = [];
}
map[n].Push(v);
})
//Set values for all form elements in the data
jQuery.each(map, function (n, v) {
find("[name='" + n + "']").val(v);
})
//Clear all form elements not in form data
find("input:text,select,textarea").each(function () {
if (!(jQuery(this).attr("name") in map)) {
jQuery(this).val("");
}
})
find("input:checkbox:checked,input:radio:checked").each(function () {
if (!(jQuery(this).attr("name") in map)) {
this.checked = false;
}
})
return this;
};
Vous devriez pouvoir utiliser ceci comme ceci:
$("#myform").deserialize(data);
Où data est une liste de paramètres telle que ce que $ ("# myform"). Serialize () produirait.
Il affecte tous les champs du formulaire et effacera les valeurs des champs qui ne sont pas contenus dans les données. Mais vous pouvez également passer n'importe quel sélecteur pour affecter uniquement des champs spécifiques, comme vous pouvez le faire avec la fonction de sérialisation. Par exemple.:
$("select").deserialize(data);
Un peu en retard sur celui-ci, mais quelqu'un pourrait trouver cela utile.
function fetchInput(identifier) {
var form_data = identifier.serialize().split('&');
var input = {};
$.each(form_data, function(key, value) {
var data = value.split('=');
input[data[0]] = decodeURIComponent(data[1]);
});
return input;
}
Je ne réponds pas maintenant à votre réponse, mais je suppose que vous voulez le sérialiser et le renvoyer au serveur, puis utiliser les données sérialisées, c'est pourquoi vous devez le désérialiser?
Si tel est le cas, vous devriez envisager d'utiliser .serializeArray (). Vous pouvez l'envoyer en tant que données POST en ajax, puis y accéder ultérieurement car vous aurez un objet.
Nécessaire tout dans une seule chaîne, qui peut être stockée dans peut-être COOKIE, et plus tard lire et remplir le même formulaire avec des valeurs d'entrée.
Séparateur des éléments d'entrée: ~(utilisez n'importe quel séparateur)
Séparateur des attributs d'entrée: |(utilisez n'importe quel séparateur)
type d'entrée | nom d'entrée | valeur d'entrée ~ type input2 | nom input2 | valeur input2
var formData = '';
$('#form_id').find('input, textarea, select').each(function(i, field) {
formData += field.type+'|'+field.name+'|'+field.value+'~';
});
Exemple:
hidden|vote_id|10~radio|option_id|~radio|option_id|427~radio|option_id|428~
Si ce que vous voulez est de supprimer la notation encodée par URL standard, vous pouvez utiliser decodeURIComponent () de JavaScript, qui vous donnera une chaîne régulière, comme ceci:
var decodedString = decodeURIComponent("Http%3A%2F%2FHello%3AWorld");
alert(decodedString);
Dans ce cas, decodedString ressemblera à Http://Hello:World
, voici un violon de travail .
Vous avez tout cela à la recherche de ce même problème et j'ai trouvé la réponse ici: Comment puis-je décoder une URL avec jQuery?
Je sais que c'est une vieille question, mais faire quelques recherches pour jQuery désérialiser m'a amené ici, donc je pourrais aussi bien essayer de donner une approche différente sur la question pour les personnes ayant le même problème.
En utilisant la fonction deparam de Jack Allan avec jQuery, vous pouvez changer cette ligne:
map[key] = value;
à
$('input[name=' + key + ']').val(value);
Ce qui chargera les données dans vos champs de formulaire.
ce code renvoie un tableau lorsque la même clé est repérée plusieurs fois dans la chaîne sérialisée
chaine="single=Single1&multiple=Multiple&multiple=Multiple1&multiple=Multiple2&multiple=Multiple3&check=check2&radio=radio1"
function deserialize(txt){
myjson={}
tabparams=chaine.split('&')
var i=-1;
while (tabparams[++i]){
tabitems=tabparams[i].split('=')
if( myjson[decodeURIComponent(tabitems[0])] !== undefined ){
if( myjson[decodeURIComponent(tabitems[0])] instanceof Array ){
myjson[decodeURIComponent(tabitems[0])].Push(decodeURIComponent(tabitems[1]))
}
else{
myjson[decodeURIComponent(tabitems[0])]= [myjson[decodeURIComponent(tabitems[0])],decodeURIComponent(tabitems[1])]
}
}
else{
myjson[decodeURIComponent(tabitems[0])]=decodeURIComponent(tabitems[1]);
}
}
return myjson;
}
Peut-être un peu tard, mais vous cherchez peut-être quelque chose comme JQuery.deserialize . Problèmes: pas de prise en charge des cases à cocher ou des boutons radio.