$ (this) .serialize () - Как добавить значение?

108

на данный момент у меня есть следующее:

$.ajax({
    type: 'POST',
    url: this.action,
    data: $(this).serialize(),
});

Это работает нормально, однако я хотел бы добавить значение к данным, поэтому я попробовал

$.ajax({
    type: 'POST',
    url: this.action,
    data: $(this).serialize() + '&=NonFormValue' + NonFormValue,
});

Но это не правильно. Есть идеи, как добавить элемент в строку сериализации? Это глобальная переменная страницы, не зависящая от формы.

Выход
источник
Не могли бы вы пояснить, что означает «это неправильно»? Что произошло? Что получил сервер?
matt b
6
Разве этого не должно быть '&NonFormValue=' + NonFormValue?
Wesley Murch

Ответы:

104

Вместо того

 data: $(this).serialize() + '&=NonFormValue' + NonFormValue,

ты, наверное, хочешь

 data: $(this).serialize() + '&NonFormValue=' + NonFormValue,

Вы должны быть осторожны, чтобы URL-кодировать значение, NonFormValueесли оно может содержать какие-либо специальные символы.

Мэтт Би
источник
1
используйте, encodeURIComponentчтобы убедиться, что в нем NonFormValueнет специальных символов
Яхья Уддин
199

Хотя ответ matt b будет работать, вы также можете использовать его .serializeArray()для получения массива из данных формы, изменения его и использования jQuery.param()для преобразования его в форму с кодировкой URL. Таким образом, jQuery выполняет сериализацию дополнительных данных за вас.

var data = $(this).serializeArray(); // convert form to array
data.push({name: "NonFormValue", value: NonFormValue});
$.ajax({
    type: 'POST',
    url: this.action,
    data: $.param(data),
});
Ли Бренецки
источник
14
Это определенно лучший вариант - полностью оставить сериализацию на jQuery, сохранив при этом возможность добавлять новые значения к значениям, полученным из формы.
jcsanyi
5
Это лучший способ сделать это, без игры со струнами,
Бретт Грегсон
Это должен быть принятый ответ. Чистый и правильный путь
Майк Арон
7

во-первых не должен

data: $(this).serialize() + '&=NonFormValue' + NonFormValue,

быть

data: $(this).serialize() + '&NonFormValue=' + NonFormValue,

а во-вторых, вы можете использовать

url: this.action + '?NonFormValue=' + NonFormValue,

или если действие уже содержит какие-либо параметры

url: this.action + '&NonFormValue=' + NonFormValue,
Никхил Бхандари
источник
Ваш второй ответ не будет иметь такого же эффекта, как заданный вопрос; NonFormValueбудет отправлен как параметр URL, а не в POST-данных. Это может быть не идеально, если: а) все, что запущено на стороне сервера, ожидает, что оно будет отправлено (например, с использованием request.POSTвместо request.REQUESTDjango), или б) NonFormValueэто то, что не должно отображаться в строке URL или истории либо по соображениям безопасности, либо потому, что это временное значение.
Leigh Brenecki
6

Сначала добавьте элемент, а затем сериализуйте:

$.ajax({
    type: 'POST',
    url: this.action,
    data: $.extend($(this), {'NonFormValue': NonFormValue}).serialize()
});
Господин
источник
1
У меня тоже не сработало. Хотя он расширяет объект, но работает не так, как ожидалось.
punitcse
5

Не забывайте, что вы всегда можете:

<input type="hidden" name="NonFormName" value="NonFormValue" />

в вашей реальной форме, что может быть лучше для вашего кода в зависимости от случая.

Джонатан
источник
2

Нам нравится:

data = $form.serialize() + "&foo=bar";

Например:

var userData = localStorage.getItem("userFormSerializeData");
var userId = localStorage.getItem("userId");

$.ajax({
    type: "POST",
    url: postUrl,
    data: $(form).serialize() + "&" + userData + "&userId=" + userId,
    dataType: 'json',
    success: function (response) {
        //do something
    }
});
Tapeshwar
источник
0

Вы можете написать дополнительную функцию для обработки данных формы, и вы должны добавить свои неформальные данные в качестве значения данных в форме. См. Пример:

<form method="POST" id="add-form">
    <div class="form-group required ">
        <label for="key">Enter key</label>
        <input type="text" name="key" id="key"  data-nonformdata="hai"/>
    </div>
    <div class="form-group required ">
        <label for="name">Ente Name</label>
        <input type="text" name="name" id="name"  data-nonformdata="hello"/>
    </div>
    <input type="submit" id="add-formdata-btn" value="submit">
</form>

Затем добавьте этот jquery для обработки формы

<script>
$(document).onready(function(){
    $('#add-form').submit(function(event){
        event.preventDefault();
        var formData = $("form").serializeArray();
        formData = processFormData(formData);
        // write further code here---->
    });
});
processFormData(formData)
{
    var data = formData;
    data.forEach(function(object){
        $('#add-form input').each(function(){
            if(this.name == object.name){
                var nonformData = $(this).data("nonformdata");
                formData.push({name:this.name,value:nonformData});
            }
        });
    });
    return formData;
}

Джитин Виджаян
источник
0

Это лучше:

data: [$(this).serialize(),$.param({NonFormValue: NonFormValue})].join('&')
Евгений
источник
Пожалуйста, добавьте более подробное описание того, почему это лучший подход.
Марк
код одной строки, и вы можете использовать объект json для большего количества параметров.
Евгений