Подтвердить что ты не робот

JQuery десериализовать форму

Я использую jQuery Serialize для сериализации элементов формы и хотел бы десериализовать их обратно. К сожалению, не удается найти какой-либо рабочий дескриптор jQuery, какие-либо предложения?

4b9b3361

Ответ 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 десериализуют меня здесь, поэтому я мог бы попытаться дать другой подход к проблеме для людей с одинаковой проблемой.