jQuery - dodaj dodatkowe parametry przy wysyłaniu (NIE ajax)


206

Korzystając z funkcji „Prześlij” jQuery - czy istnieje sposób na przekazanie dodatkowych parametrów do formularza? NIE chcę tego robić w Ajaxie - jest to normalne, typowe dla odświeżania formularza przesyłanie.

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

Jakiej technologii po stronie serwera używasz?
Enrique

Zobacz moją odpowiedź [tutaj] [1], która dołącza się do formularza zserializowanego przed przesłaniem. [1]: stackoverflow.com/questions/17809056/…
Jeff Lowery

Odpowiedzi:


371

Ten zrobił to dla mnie:

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

jest oparty na odpowiedzi Daffa, ale dodał atrybut NAME, aby mógł się wyświetlać w zbiorze formularzy, i zmienił WARTOŚĆ na WARTOŚĆ Sprawdził także ID FORMULARZA (w moim przypadku formularz 1)

użył firebuga Firefoksa, aby sprawdzić, czy element został wstawiony.

Ukryte elementy są ponownie wysyłane do zbioru formularzy, odrzucane są tylko pola tylko do odczytu.

Michel


46
Jak śpiewać binarnie „you are my sunshine”? Dziękuję bardzo. To rozwiązuje tak wiele rzeczy.
Ciel

38
Możesz nieznacznie poprawić czytelność: var input = $ ("<input>", {type: "hidden", name: "mydata", value: "bla"}); $ ('# form1'). append ($ (wejście));
Konstantine Kalbazov

2
$ („<wejście>”) .attr („typ”, „ukryty”). attr („nazwa”, „moje dane”). val („bla”). appendTo ('# form1'); jest inny sposób
Kijów

6
Podobało mi się połączenie: $ („<input>”, {type: „hidden”, name: „mydata”, value: „bla”}). AppendTo („# form1”);
gabeio

Czy nie ma ograniczenia rozmiaru danych? Wysłałem duży obiekt za pomocą JSON.stringify (obj) i tej metody, która wyglądała na obciętą.
omikron

26

W twoim przypadku wystarczy dynamicznie dodać kolejne ukryte pole do formularza.

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

Dane, które muszę przesłać, nie są przystosowane do formy. Należy go przechwycić i obsłużyć po stronie serwera.
Ciel

Co rozumiesz przez „niezdolny do formy”?
Vincent Ramdhanie

Przepraszamy - to w ogóle nie działało. Nawet przy wymuszonych danych nie wstrzykuje ich do formularza.
Ciel

Nie można go umieścić w polu formularza.
Ciel

2
Jeśli jest to ciąg, można go umieścić w polu formularza
PetersenDidIt

19

Możesz nawet użyć tego. działało dobrze dla mnie

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

to prześle btnsubmit = Zapisz jako wartość GET do formularza register.php.


To wydaje się być bardziej eleganckim rozwiązaniem. Pamiętaj tylko, aby użyć encodeURIComponent()wartości parametru w zależności od rodzaju danych.
Andres SK

1
Ten jest w rzeczywistości lepszy, gdy pozwalasz użytkownikowi przesłać formularz wiele razy. Formularz nie otrzyma więcej niż jednego ukrytego pola o różnych wartościach.
Mellon,

11

Możesz napisać funkcję jQuery, która pozwoliła Ci dodać ukryte pola do formularza:

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

A następnie dodaj ukryte pole przed przesłaniem:

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

1
Zobacz stackoverflow.com/questions/2601223/... w celu uzyskania bardziej zaawansowanej wersji addHidden
Jonathan

1
Podoba mi się prostota tego rozwiązania. Nie obsługuje wielu skrzynek, ale ładnie obsługuje skrzynkę.
Phil

11

Nie trzeba wiązać zdarzenia przesłania za pomocą kliknięcia przycisku wysyłania, wystarczy powiązać zdarzenie przesłania, a ono przechwyci zdarzenie przesłania bez względu na to, jak zostanie wywołane.

Pomyśl, że chcesz przesłać sortowalny sposób, jak za pośrednictwem ajax. Spróbuj zrobić coś takiego:

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

wciąż nie pokazuje się po stronie serwera ... czy jest coś specjalnego, co muszę zrobić, aby ukryte pole pojawiło się na serwerze? Przechodzi przez C # / ASP.NET MVC przy użyciu obiektu FormCollection.
Ciel

Zaktualizowałem moją odpowiedź, myślę, że rozumiem, co próbujesz zrobić.
PetersenDidIt

Czy dodajesz nameatrybut do wygenerowanego formularza ukrytego formularza? Zgodnie z stackoverflow.com/questions/504681 /... wygląda na to, że obiekty FormCollection wymagają, aby wszystkie <input>elementy miały nazwy.
npdoty

Tak, próbuję wcisnąć sortable do kolekcji form jako ciąg wartości oddzielonych przecinkami. Próbowałem twojej aktualizacji i nadal nie publikuje. Nie jestem pewien, co robię źle ... Doceniam pomoc.
Ciel

Wygląda na to, że problem nie występuje po stronie klienta, ale po stronie serwera.
PetersenDidIt

2

Podobna odpowiedź, ale chciałem ją udostępnić do łatwego / szybkiego testu.

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>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.