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.