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();
    });
});
Ciel
źródło
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

Michel
źródło
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));
Daff
źródło
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.

Parag
źródło
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();
Jonathan
źródło
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);
    });
});
PetersenDidIt
źródło
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>

Cacho Santa
źródło