Я использую jQuery Serialize для сериализации элементов формы и хотел бы десериализовать их обратно. К сожалению, не удается найти какой-либо рабочий дескриптор jQuery, какие-либо предложения?
JQuery десериализовать форму
Ответ 1
Половина jQuery Serialize param(), поэтому половина того, что десериализует строку запроса, будет депарамом. К сожалению, я не смог найти хорошую отдельную депарам. На данный момент я рекомендую получить jQuery BBQ library и использовать это. Если вам не нужны другие вещи, вы можете их удалить. Я где-то читал, что Бен Альман (ковбой) планировал извлечь депарам в свой собственный модуль.
Для остальной десериализации вам просто нужно пропустить объект, возвращаемый deparam, и для каждой пары ключей и значений в объекте, выбрать элемент формы на основе ключа и установить значение элемента формы для значение.
Ответ 2
Я написал версию jQuery.deserialize, которая поддерживает сериализованные данные, сгенерированные из функций serialize, serializeArray и serializeObject. Он также поддерживает все типы элементов элементов, включая флажки и переключатели.
Ответ 3
Попробуйте следующее:
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;
}
Ответ 4
Мне очень хотелось попробовать JQuery.deserialize, но он, похоже, вообще не обрабатывал флажки, так что это не помогло моим целям. Поэтому я написал свой собственный. Это оказалось проще, чем я думал, потому что функция jQuery val() выполняет большую часть работы:
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;
};
Вы должны иметь возможность использовать это следующим образом:
$("#myform").deserialize(data);
Где данные - список параметров, например $( "# myform" ). serialize() создаст.
Он затрагивает все поля формы и очищает значения полей, которые не содержатся в данных. Но вы также можете передать любой селектор, чтобы влиять только на определенные поля, как вы можете с помощью функции сериализации. Например:.
$("select").deserialize(data);
Ответ 5
Бит поздно на этом, но кто-то может найти это полезным.
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;
}
Ответ 6
Теперь я не отвечаю на ваш ответ, но я предполагаю, что вы хотите сериализовать его и отправить обратно на сервер, а затем использовать сериализованные данные, поэтому вы должны их десериализовать?
Если это так, вы должны рассмотреть возможность использования .serializeArray(). Вы можете отправить его как данные POST в ajax, а затем получить доступ позже, потому что у вас будет объект.
Ответ 7
Может быть, немного поздно, но, возможно, вы ищете что-то вроде JQuery.deserialize. Проблемы: нет поддержки флажков или переключателей.
Ответ 8
Используя функцию Джека Аллана депарама с jQuery, вы можете изменить эту строку:
map[key] = value;
к
$('input[name=' + key + ']').val(value);
Что загрузит данные обратно в поля формы.
Ответ 9
этот код возвращает массив, когда один и тот же ключ разыгрывается несколько раз в сериализованной строке
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;
}
Ответ 10
Требуется все в одной строке, которая может быть сохранена, возможно, COOKIE, а затем читать и заполнять ту же форму с входными значениями.
Сепаратор входных элементов: ~ (используйте любой разделитель)
Сепаратор входных атрибутов: | (используйте любой разделитель)
тип ввода | имя входа | входное значение ~ input2 type | input2 name | значение input2
var formData = '';
$('#form_id').find('input, textarea, select').each(function(i, field) {
formData += field.type+'|'+field.name+'|'+field.value+'~';
});
Пример:
hidden|vote_id|10~radio|option_id|~radio|option_id|427~radio|option_id|428~
Ответ 11
Если вы хотите удалить стандартную нотацию с кодировкой URL, вы можете использовать JavaScript decodeURIComponent(), который даст вам регулярная строка, так же:
var decodedString = decodeURIComponent("Http%3A%2F%2FHello%3AWorld");
alert(decodedString);
В этом случае decodedString будет выглядеть как Http://Hello:World
, здесь рабочая скрипта.
Получил весь этот поиск этой же проблемы и нашел ответ здесь: Как я могу декодировать URL-адрес с помощью jQuery?
Я знаю, что это старый вопрос, но некоторые поиски jQuery десериализуют меня здесь, поэтому я мог бы попытаться дать другой подход к проблеме для людей с одинаковой проблемой.