Prześlij formularz za pomocą przycisku poza znacznikiem <form>


301

Powiedz, że mam:

<form method="get" action="something.php">
    <input type="text" name="name" />
</form>

<input type="submit" />

Jak przejść do przesłania tego formularza za pomocą tego przycisku przesyłania poza formularzem, myślę, że w HTML5 jest atrybut akcji dla przesyłania, ale nie jestem pewien, czy jest to w pełni przeglądarka i czy tak nie jest Zrób to?


2
Nie sądzę, że możesz to zrobić bez javascript. W jaki sposób przeglądarka będzie wiedzieć, w jakiej formie? Może być ich kilka. Dlaczego nie możesz umieścić przycisku przesyłania w formularzu?
Keith,

1
jeśli nie chcesz używać JS, to w html (<5) wydaje mi się to niemożliwe, po prostu z ciekawości, dlaczego miałbyś taki układ w kodzie?
Kumar

1
Mam obszar ustawień z wieloma zakładkami z przyciskiem do aktualizacji wszystkich, ze względu na jego konstrukcję przycisk byłby poza formą. Mam zamiar rzucić palcem z opcją HTML5 lub rozwiązaniem JS, ponieważ to pytanie wydaje się zbędne.
daryl,

1
@Kumar, myślałem również, że to niemożliwe, ale wygląda na to, że nie jest stackoverflow.com/a/23456905/932473
dav

Odpowiedzi:


84

Aktualizacja: w nowoczesnych przeglądarkach możesz to zrobić za pomocą formatrybutu .


O ile mi wiadomo, nie można tego zrobić bez javascript.

Oto, co mówi specyfikacja

Elementy używane do tworzenia formantów zwykle pojawiają się w elemencie FORM, ale mogą także pojawiać się poza deklaracją elementu FORM, gdy są używane do budowania interfejsów użytkownika. Jest to omówione w części dotyczącej zdarzeń wewnętrznych. Pamiętaj, że formanty poza formularzem nie mogą być formantami pomyślnymi.

To moja śmiała

submitPrzycisk uważany jest kontrola.

http://www.w3.org/TR/html4/interact/forms.html#h-17.2.1

Z komentarzy

Mam obszar ustawień z wieloma zakładkami z przyciskiem do aktualizacji wszystkich, ze względu na jego konstrukcję przycisk byłby poza formą.

Dlaczego nie umieścić inputformularza w środku, ale użyć CSS, aby umieścić go w innym miejscu na stronie?


19
Do Twojej wiadomości, obsługa HTML5, jeszcze nie jest doskonała, ale się to
udaje

6
Jestem tu trochę spóźniony, ale jak umieścić dane w formularzu, ale umieścić je gdzie indziej?
cgf

Można użyć <button> znacznik do tej celów dla HTML4
DEGR

Odpowiedź nie jest już ważna, ponieważ odpowiedź Wiewiórki Joe działa - od 2016 r.
Peter

istnieje problem z zaproponowanymi rozwiązaniami JavaScript. na przykład w najnowszym Chrome weryfikacja HTML5 (wymagana itp.) jest pomijana. jednym z rozwiązań, które mogę wymyślić, są dwa przyciski przesyłania, jeden ukryty. kliknięcie należy uruchomić na ukrytym przycisku. formularza nie należy przesyłać bez odpowiedniej weryfikacji.
zwycięzca n.

612

W HTML5 istnieje atrybut formularza . Gruntownie

<form id="myform" method="get" action="something.php">
    <input type="text" name="name" />
</form>

<input type="submit" form="myform" />

35
To nie działa w IE dla każdego, kto planuje z niego korzystać. Użyłem go, ale potem zdecydowałem się dodać wywołanie zwrotne funkcji wysyłania zdarzenia, aby ręcznie przesłać formularz w przeglądarce IE.
racl101

1
Które wersje IE dokładnie?
mwld

11
Zrobiłem to jako <button type="submit" form="frmFoo" onclick="!this.form&&$('#'+$(this).attr('form')).submit()">płynną rezerwę : jak wykazały eksperymenty, this.form jest dołączoną formą DomElement, podczas gdy w przeciwnym razie jest zerowy. // edycja: jQuery, ale możliwe także z wanilią, również ofc
Adrian Föder

2
Jeśli chcesz zobaczyć atrybut formularza w MS Edge, zagłosuj tutaj: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/...
mkurz

2
Wersja awaryjna @ AdrianFöder w wersji waniliowo-JS wyglądałaby następująco:<button type="submit" form="frmFoo" onclick="!this.form && document.getElementById('myform').submit()">
romaricdrigon

318

Wciąż tu brakuje rozwiązania, które działa dla mnie świetnie. Wymaga posiadania wizualnie ukrytego elementu <submit>lub <input type="submit">elementu <form>powiązanego <label>poza nim. Wyglądałoby to tak:

<form method="get" action="something.php">
     <input type="text" name="name" />
     <input type="submit" id="submit-form" class="hidden" />
</form>

<label for="submit-form" tabindex="0">Submit</label>

Teraz ten link umożliwia „kliknięcie” <submit>elementu formularza przez kliknięcie <label>elementu.


4
lepsze rozwiązanie imho bez wymaga js i większych zmian :)
Anton Hasan

52
Działa również w IE 11. Wiem, że często nie widzisz słów „działa” i „IE” w tym samym zdaniu.
shim

2
Lepsze rozwiązanie bez żadnych niezgodności. Jeśli używasz Bootstrap na Twitterze, możesz po prostu użyć „btn btn-primary” dla klasy etykiety css i działa idealnie.
Juanda

7
Bardzo fajne rozwiązanie, jednak może być jeden sprzeciw wobec korzystania z tej metody. A labelnie jest elementem aktywowanym (AFAIK), więc nie jest intuicyjny dla użytkownika, który używa tylko klawiatury do nawigacji do „przycisku”, a następnie na przykład naciska spację, aby aktywować ten przycisk. (Zdaję sobie sprawę, że możesz <enter>zamiast tego nacisnąć , ale to nie jedyny sposób, w jaki ludzie są przyzwyczajeni do nawigacji po formularzach za pomocą klawiatury)
Auke

11
Aby skupić się na labelprzycisku zakładki via, możesz użyć tabindexatrybutu HTML: <label for="submit-form" tabindex="0">Submit</label>zgodnie z tym pytaniem
MarthyM

47

jeśli możesz użyć jQuery, możesz użyć tego

<form method="get" action="something.php" id="myForm">
    <input type="text" name="name" />

    <input type="submit" style="display:none" />
</form>

<input type="button" value="Submit" id="myButton" />

<script type="text/javascript">
    $(document).ready(function() {
       $("#myButton").click(function() {
           $("#myForm").submit();
       });
    });
</script>

Najważniejsze jest więc utworzenie przycisku takiego jak Prześlij i umieszczenie prawdziwego przycisku Prześlij w formularzu (oczywiście ukrywanie go) i przesłanie formularza za pomocą jquery poprzez kliknięcie przycisku „Fake Prześlij”. Mam nadzieję, że to pomoże.


1
Aby działało zarówno w przeglądarce zgodnej z HTML5, jak i IE, oto mój jQuery$('button[form]').click(function (){ var formId = $(this).attr('form'); $('#' + formId).submit(); });
Snook

35
<form method="get" id="form1" action="something.php">

</form>

<!-- External button-->
<button type="submit" form="form1">Click me!</button>

To działało dla mnie, aby mieć zdalny przycisk przesyłania formularza.


dzięki człowieku, za tę prostą funkcję nie chcę pisać wierszy kodu JS. PS: moja aplikacja nie musi obsługiwać IE
Mani

1
Głosuj tutaj, jeśli chcesz zobaczyć funkcję atrybutu formularza w MS Edge: wpdev.uservoice.com/forums/257854-microsoft-edge-developer/…
mkurz

22

Podobne do innego rozwiązania tutaj, z niewielkimi modyfikacjami:

<form method="METHOD" id="FORMID">
   <!-- ...your inputs -->
</form>
<button type="submit" form="FORMID" value="Submit">Submit</button>

https://www.w3schools.com/tags/att_form.asp


To najlepsza odpowiedź, IMO. Prosto z MDN na atrybucie formularza przycisku: Element formularza, z którym powiązany jest przycisk (jego właściciel formularza). Wartość atrybutu musi być atrybutem id elementu <form> w tym samym dokumencie. Jeśli ten atrybut nie zostanie określony, element <button> zostanie powiązany z elementem nadrzędnym <form>, jeśli taki istnieje. Ten atrybut umożliwia powiązanie elementów <button> z elementami <form> w dowolnym miejscu dokumentu, nie tylko jako potomków elementów <form>.
AlexSashaRegan

Pamiętaj: To nie działa w Internet Explorerze 11. Wypróbuj tutaj: cdpn.io/mdix/debug/PooPqaM/PNAvYKNJojRr
Marc Dix

19

Spróbuj tego:

<input type="submit" onclick="document.forms[0].submit();" />

Chociaż sugerowałbym dodanie iddo formularza i uzyskanie dostępu przez to zamiast document.forms[index].


1
Tak, wiem jak to zrobić za pomocą javascript, jeśli spojrzysz, nie oznaczyłem go jako javascript.
daryl,

Przepraszam, nie było jasne z twojego postu, że szukasz sposobu innego niż JS (myślałem, że przegapiłeś oznaczenie go jako JS).
Mrchief,

1
Jest to najlepszy sposób, aby to zrobić, jeśli chcesz przesłać formularz zewnętrzny za pomocą przycisku w innym formularzu.
Vahid Amiri,

11

Zawsze możesz użyć jQuery:

<form id="myForm">
  <!-- form controls -->
</form>
<input type="submit" id="myButton">

<script>
$(document).ready(function () {
  $("#myButton").click(function () {
    $("#myForm").submit();
  });
});
</script>

8

Oto całkiem solidne rozwiązanie, które zawiera najlepsze dotychczasowe pomysły, a także zawiera moje rozwiązanie problemu wyróżnionego w Offerein. Nie używa się javascript.

Jeśli zależy ci na kompatybilności wstecznej z IE (a nawet Edge 13), nie możesz użyć tego form="your-form" atrybutu .

Użyj standardowego wejścia przesłanego bez wyświetlania i dodaj etykietę poza formularzem:

<form id="your-form">
  <input type="submit" id="your-form-submit" style="display: none;">
</form>

Zwróć uwagę na użycie display: none;. To jest celowe. Używanie .hiddenklas bootstrap powoduje konflikty z jQuery's .show()i .hide()od tego czasu jest przestarzałe w Bootstrap 4.

Teraz wystarczy dodać etykietę do przesłania (w stylu bootstrap):

<label for="your-form-submit" role="button" class="btn btn-primary" tabindex="0">
  Submit
</label>

W przeciwieństwie do innych rozwiązań używam również tabindex - ustawionego na 0 - co oznacza, że ​​jesteśmy teraz kompatybilni z klawiszami tabulacji. Dodanie role="button"atrybutu nadaje mu styl CSS cursor: pointer. Zrobione. ( Zobacz to skrzypce ).


Miły! Działa świetnie z IE11 i firefox. Dzięki!
eaglei22

@ eaglei22 miło to słyszeć :)
Jonathan

Bardzo pomocne jest zestawienie wszystkich funkcji / sugestii z innych źródeł, więc dziękuję. Jednak nawet jeśli możesz teraz przejść do przycisku / etykiety, nie widzę żadnego sposobu „kliknięcia” na klawiaturze, np. Naciśnięcie Enternie ma żadnego efektu. Zatem możliwość zakładania się na to wydaje się trochę bezcelowa. Czy można to zrobić bez użycia JavaScript?
Andrew Willems,

@AndrewWillems to dobry punkt. Niestety nie widzę sposobu na użycie klawiatury do wywołania zdarzenia kliknięcia bez javascript. PS: jeśli post był dla Ciebie pomocny, proszę głosować. Nic Cię to nie kosztuje, ale wiele znaczy dla każdego, kto udzieli przydatnych odpowiedzi.
Jonathan

1
Uwielbiam cię także za naprawienie niechlujnej i niepoprawnej <input... />składni samozamykającej, która prawie wszyscy rażąco i niepoprawnie używają tutaj (też), do właściwej pustej etykiety no-close! :) Kudos!
Sz.

3

To działa idealnie! ;)

Można to zrobić za pomocą Ajaxa i za pomocą tego, co nazywam: „elementem lustrzanego formularza”. Zamiast wysłać formularz z elementem zewnętrznym, możesz utworzyć fałszywy formularz. Poprzedni formularz nie jest potrzebny.

<!-- This will do the trick -->
<div >
    <input id="mirror_element" type="text" name="your_input_name">
    <input type="button" value="Send Form">
</div>

Kod ajax będzie wyglądał następująco:

    <script>
        ajax_form_mirror("#mirror_element", "your_file.php", "#your_element_response", "POST");

        function ajax_form_mirror(form, file, element, method) {
            $(document).ready(function() {
                // Ajax
                $(form).change(function() { // catch the forms submit event
                    $.ajax({                // create an AJAX call...
                        data: $(this).serialize(),      // get the form data
                        type: method,                   // GET or POST
                        url: file,                      // the file to call
                        success: function (response) {   // on success..
                        $(element).html(response);  // update the DIV
                        }
                    });

                    return false; // cancel original event to prevent form submitting
                });
            });
        }
   </script>

Jest to bardzo przydatne, jeśli chcesz wysłać dane w innym formularzu bez przesyłania formularza nadrzędnego.

Ten kod prawdopodobnie można dostosować / zoptymalizować w zależności od potrzeb. Działa idealnie !! ;) Działa również, jeśli chcesz wybrać pole opcji takie jak to:

<div>
    <select id="mirror_element" name="your_input_name">
        <option id="1" value="1">A</option>
        <option id="2" value="2">B</option>
        <option id="3" value="3">C</option>
        <option id="4" value="4">D</option>
    </select>
</div>

Mam nadzieję, że pomogło to komuś takiemu, pomogło mi. ;)


1

Może to może działać, ale nie wiem, czy to jest poprawny HTML.

<form method="get" action="something.php">
    <input type="text" name="name" />
    <input id="submitButton" type="submit" class="hide-submit" />
</form>

<label for="submitButton">Submit</label>

3
Ta odpowiedź już istnieje dla samego pytania. stackoverflow.com/a/23456905/2968465
Jayant Bhawal

0

Wystąpił problem polegający na tym, że próbowałem ukryć formularz przed elementem komórki tabeli, ale nadal wyświetlałem przycisk przesyłania formularzy. Problem polegał na tym, że element formularza wciąż zajmował dodatkowe puste miejsce, przez co format mojej komórki tabeli wyglądał dziwnie. Wyświetlanie: brak i widoczność: ukryte atrybuty nie działały, ponieważ również ukrywałby przycisk wysyłania, ponieważ był zawarty w formularzu, który próbowałem ukryć. Prostą odpowiedzią było ustawienie wysokości formularzy na prawie nic za pomocą CSS

Więc,

CSS -

    #formID {height:4px;}

pracował dla mnie.


0

Użyłem w ten sposób i podobało mi się, to sprawdza poprawność formularza przed przesłaniem również jest kompatybilny z safari / google. bez jquery nn

        <module-body>
            <form id="testform" method="post">
                <label>Input Title</label>
                <input name="named1" placeholder="Placeholder"  title="Please enter only alphanumeric characters." required="required" pattern="[A-Za-z0-9]{1,20}" />
                <alert>No Alerts!</alert>

                <label>Input Title</label>
                <input placeholder="Placeholder" title="Please enter only alphanumeric characters." required="required" pattern="[A-Za-z0-9]{1,20}" />
                <alert>No Alerts!</alert>

                <label>Input Title</label>
                <input placeholder="Placeholder" title="Please enter only alphanumeric characters." required="required" pattern="[A-Za-z0-9]{1,20}" />
                <alert>No Alerts!</alert>
            </form>
        </module-body>
        <module-footer>
            <input type="button" onclick='if (document.querySelector("#testform").reportValidity()) { document.querySelector("#testform").submit(); }' value="Submit">
            <input type="button" value="Reset">
        </module-footer>
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.