$ (this) .serialize () - Як додати значення?


105

На даний момент у мене є таке:

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

Це добре працює, проте я хотів би додати значення даним, тому я постарався

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

Але це не було правильно. Будь-які ідеї щодо того, як можна додати елемент до рядка серіалізації? Це глобальна змінна сторінка, яка не є формою.


Чи можете ви уточнити, що означає "що не було правильно"? Що трапилось? Що отримав сервер?
мат б

6
Чи не повинно бути це '&NonFormValue=' + NonFormValue?
Веслі Мерч

Відповіді:


103

Замість

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

ви, мабуть, хочете

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

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


1
використовуйте encodeURIComponentдля того, щоб у них NonFormValueне було спеціальних символів
Yahya Uddin

197

Незважаючи на те, що відповідь 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, а не в POSTed даних. Це може бути не ідеально, якщо а) те, що працює на сервері, очікує, що воно буде POSTed (наприклад, використання request.POSTзамість request.REQUESTDjango), або b) NonFormValueє тим, що не повинно з’являтися в URL-адресі або історії ні з міркувань безпеки, ні тому, що це минуще значення.
Лі Бренецькі

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
    }
});

0

Ви можете написати додаткову функцію для обробки даних форми, і ви повинні додати свої неформальні дані як значення даних у form.seet example:

<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 для більшої кількості парам.
Євген
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.