Как изменить данные сериализованной формы в jQuery? - PullRequest
77 голосов
/ 22 февраля 2011

Я пытаюсь отправить свою форму в AJAX, поэтому я должен сериализовать () данные. Но я использую fckEditor, и jQuery не знает, как с этим справиться, поэтому после сериализации я пытаюсь вручную изменить значение, но пока не получается ... любые идеи

if(content_val!=""){
    var values = $("#frmblog").serialize();
    values.content = content_val; //content_val is the manually fetched data which I am trying to insert into the serialized content.
    alert(content_val); alert(values);
}

Ответы [ 3 ]

145 голосов
/ 22 февраля 2011

serialize возвращает строку в кодировке URL, содержащую поля формы.Если вам нужно добавить к нему, вы делаете это, используя стандартные строковые правила в кодировке URL, например:

var values = $("#frmblog").serialize();
values += "&content=" + encodeURIComponent(content_val);

(Выше предполагается, что всегда будет одно значение в values после serializeвызовите, если это не обязательно верно, определите, следует ли использовать &, основываясь на том, пусто ли values, прежде чем добавлять к нему.)

В качестве альтернативы, если хотите, вы можете использовать serializeArray, а затем добавьте в массив и используйте jQuery.param, чтобы превратить результат в строку запроса, но это кажется длинным 'раундом:

// You can also do this, but it seems a long way 'round
var values = $("#frmblog").serializeArray();
values.push({
    name: "content",
    value: content_val
});
values = jQuery.param(values);

Обновление : В комментарии, добавленном позже, вы сказали:

Проблема в том, что некоторые значения по умолчанию задаются в ключе содержимого во время процесса сериализации, поэтому яя не могу просто прикрепить новое значение, мне нужно обновить уже имеющееся в нем значение "

Это меняет дело. Больно искать content в строке в кодировке URL, поэтому явы бы использовали массив:

var values, index;

// Get the parameters as an array
values = $("#frmblog").serializeArray();

// Find and replace `content` if there
for (index = 0; index < values.length; ++index) {
    if (values[index].name == "content") {
        values[index].value = content_val;
        break;
    }
}

// Add it if it wasn't there
if (index >= values.length) {
    values.push({
        name: "content",
        value: content_val
    });
}

// Convert to URL-encoded string
values = jQuery.param(values);

Возможно, вы захотите сделать эту функцию многоразовой.

4 голосов
/ 06 января 2017

Вот полный плагин jquery, основанный на ответе @ TJ.Вы можете вызвать

$('form#myForm').awesomeFormSerializer({
    foo: 'bar',
})

, который заменит или добавит параметр 'foo' со значением 'bar' (или любой другой параметр, который вы добавите в объект)

Плагин jQuery:

// Not builtin http://stackoverflow.com/a/5075798/2832282
(function ( $ ) {
    // Pass an object of key/vals to override
    $.fn.awesomeFormSerializer = function(overrides) {
        // Get the parameters as an array
        var newParams = this.serializeArray();

        for(var key in overrides) {
            var newVal = overrides[key]
            // Find and replace `content` if there
            for (index = 0; index < newParams.length; ++index) {
                if (newParams[index].name == key) {
                    newParams[index].value = newVal;
                    break;
                }
            }

            // Add it if it wasn't there
            if (index >= newParams.length) {
                newParams.push({
                    name: key,
                    value: newVal
                });
            }
        }

        // Convert to URL-encoded string
        return $.param(newParams);
    }
}( jQuery ));
0 голосов
/ 26 июня 2019

С версией JQuery. Вы можете использовать это вместо одного для редактирования текущего переданного значения (самое короткое)

var values = $("#frmblog").serializeArray();
values.find(input => input.name == 'content').value = content_val;
console.log(values);
...