jQuery - додайте додаткові параметри при надсиланні (НЕ ajax)


206

Використовуючи jQuery 'submit' - чи є спосіб передати додаткові параметри до форми? Я НЕ шукаю робити це з Ajax - це нормальне, типове оновлення форми.

$('#submit').click(function () {
    $('#event').submit(function () {
        data: { 
        form['attendees'] = $('#attendance').sortable('toArray').toString();
    });
});

Яку технологію на стороні сервера ви використовуєте?
Енріке

Дивіться мою відповідь [тут] [1], яка додається до серіалізованої форми перед надсиланням. [1]: stackoverflow.com/questions/17809056/…
Джефф Лоурі

Погляньте на stackoverflow.com/questions/603924/…
LCJ

Відповіді:


371

Цей зробив це для мене:

var input = $("<input>")
               .attr("type", "hidden")
               .attr("name", "mydata").val("bla");
$('#form1').append(input);

ґрунтується на відповіді Даффа, але додав атрибут NAME, щоб він відображався у колекції форм і змінив VALUE на VAL. Також перевіряв ідентифікатор ФОРМИ (form1 у моєму випадку)

використовував Firefox firebug, щоб перевірити, чи введено елемент.

Приховані елементи надсилаються до колекції форм, відкидаються лише поля лише для читання.

Мішель


46
Як я співаю "ти моє сонечко" у бінарному? Дуже дякую. Це вирішує так багато речей.
Ciel

38
Ви можете трохи покращити читабельність: var input = $ ("<input>", {type: "hidden", ім'я: "mydata", значення: "bla"}); $ ('# form1'). додавати ($ (введення));
Костянтин Калбазов

2
$ ("<input>") .attr ("тип", "приховано"). attr ("ім'я", "мої дані"). val ("bla"). appendTo ('# form1'); інший спосіб
київ

6
Мені сподобалося комбо з: $ ("<input>", {type: "hidden", ім'я: "mydata", значення: "bla"}). AppendTo ("# form1");
gabeio

Чи не існує обмеження щодо розміру даних? Я надіслав якийсь великий об’єкт за допомогою JSON.stringify (obj) і цього методу, і він виявився усіченим.
omikron

26

У вашому випадку достатньо просто динамічно додати ще одне приховане поле до вашої форми.

var input = $("<input>").attr("type", "hidden").val("Bla");
$('#form').append($(input));

Дані, які мені потрібно надати, не підлягають форму. Він повинен бути захоплений та оброблений на стороні сервера.
Ciel

Що ви маєте на увазі під "не формою здатною"?
Вінсент Рамдані

Вибачте - це взагалі не спрацювало. Навіть із просто вимушеними даними він не вводить їх у форму.
Ciel

Його не можна розмістити у полі форми.
Ciel

2
Якщо його рядок, його можна помістити у поле форми
PetersenDidIt

19

Ви можете навіть використовувати цей. добре працював для мене

$("#registerform").attr("action", "register.php?btnsubmit=Save") 
$('#registerform').submit();

це надішле btnsubmit = Зберегти як GET значення для register.php форми.


Це здається більш елегантним рішенням. Просто не забудьте використовувати encodeURIComponent()для значення параметра залежно від типу даних.
Андрес СК

1
Цей варіант насправді кращий, коли дозволити користувачеві надсилати форму кілька разів. Форма не отримає більше одного прихованого поля з різними значеннями.
Меллон

11

Ви можете написати функцію jQuery, яка дозволила вам додавати приховані поля до форми:

// This must be applied to a form (or an object inside a form).
jQuery.fn.addHidden = function (name, value) {
    return this.each(function () {
        var input = $("<input>").attr("type", "hidden").attr("name", name).val(value);
        $(this).append($(input));
    });
};

А потім додайте приховане поле перед відправкою:

var frm = $("#form").addHidden('SaveAndReturn', 'Save and Return')
                    .submit();

1
Дивіться stackoverflow.com/questions/2601223/… для більш вдосконаленої версії addHidden
Jonathan

1
Мені подобається простота цього рішення. Він не вирішує багато випадків, але він чудово обробляє справу, яку він робить.
Філ

11

Вам не потрібно прив'язувати подію подання одним натисканням кнопки "Надіслати", просто прив'яжіть подію подання, і вона зафіксує подію подання, не маючи на увазі, як вона спрацьовує.

Подумайте, що ви хочете - подати сортування, як ви б через ajax. Спробуйте зробити щось подібне:

var form = $('#event').submit(function () {
    $.each($('#attendance').sortable('toArray'),function(i, value){
        $("<input>").attr({
            'type':'hidden',
            'name':'attendace['+i+']'
        }).val(value).appendTo(form);
    });
});

все ще не відображається на сервері formcollection ... чи є щось особливе, що я повинен зробити, щоб отримати приховане поле, яке з'явиться на сервері? Він проходить через C # / ASP.NET MVC за допомогою об'єкта FormCollection.
Ciel

Оновили свою відповідь, подумайте, я беру на себе те, що ви намагаєтесь зробити.
PetersenDidIt

Ви додаєте nameатрибут до створеного прихованого введення форми? Згідно stackoverflow.com/questions/504681 / ... це виглядає як об'єкти FormCollection вимагають всіх <input>елементів , які мають імена.
npdoty

Так, я намагаюся просунути сортувальну форму у збірник як рядок значень, розділених комами. Я спробував ваше оновлення, і воно все ще не публікується. Я не впевнений, що роблю неправильно ... Я ціную допомогу.
Ciel

Здається, проблема не на стороні клієнта, а на стороні сервера.
PetersenDidIt

2

Аналогічна відповідь, але я просто хотів зробити це доступним для легкого / швидкого тестування.

var input = $("<input>")
               .attr("name", "mydata").val("go Rafa!");

$('#easy_test').append(input);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js"></script>



<form id="easy_test">
  
</form>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.