Czy ważne jest posiadanie formularza html wewnątrz innego formularza html?

Czy poprawny html powinien mieć:

<form action="a">
    <input.../>
    <form action="b">
        <input.../>
        <input.../>
        <input.../>
    </form>
    <input.../>
</form>

Więc kiedy wysyłasz "b", dostajesz tylko pola w wewnętrznym formularzu. Po wysłaniu "a" otrzymasz wszystkie pola minus te w "b".

Jeśli nie jest to możliwe, jakie obejścia tej sytuacji są dostępne?

Author: allyourcode, 2009-02-17

11 answers

A. nie jest poprawny HTML ani XHTML

W oficjalnej specyfikacji W3C XHTML, sekcja B. "Element" stwierdza, że:

"form must not contain other form elements."

Http://www.w3.org/TR/xhtml1/#prohibitions

Co do starszego HTML 3.2 spec , sekcja o elemencie formularzy stwierdza, że:

" Każda forma musi być zamknięta w Element formularza. Może być kilka formularzy w jednym dokumencie, ale Element formularza nie może być zagnieżdżone."

B. Obejście Pracy

Istnieją obejścia przy użyciu JavaScript bez konieczności zagnieżdżania znaczników formularzy.

"Jak utworzyć zagnieżdżony formularz." (pomimo tytułu jest to Nie zagnieżdżone znaczniki formularzy, ale obejście JavaScript).

Http://blog.avirtualhome.com/how-to-create-nested-forms/

Uwaga: chociaż można oszukać walidatorów W3C, aby przekazali stronę manipulując DOM za pomocą skryptów, to nadal nie legalny HTML. Problem z używaniem takich metod polega na tym, że zachowanie kodu nie jest teraz gwarantowane w różnych przeglądarkach. (ponieważ nie jest to standard)

 320
Author: GeneQ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-16 10:29:50

W przypadku, gdy ktoś znajdzie ten post tutaj jest świetnym rozwiązaniem bez potrzeby JS. Użyj dwóch przycisków submit z różnymi atrybutami nazwy sprawdź w języku serwera, który przycisk submit został naciśnięty, ponieważ tylko jeden z nich zostanie wysłany na serwer.

<form method="post" action="ServerFileToExecute.php">
    <input type="submit" name="save" value="Click here to save" />
    <input type="submit" name="delete" value="Click here to delete" />
</form>

Strona serwera może wyglądać tak, jeśli używasz php:

<?php
    if(isset($_POST['save']))
        echo "Stored!";
    else if(isset($_POST['delete']))
        echo "Deleted!";
    else
        echo "Action is missing!";
?>
 43
Author: Andreas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-07 11:45:12

HTML 4.x & HTML5 nie zezwala na zagnieżdżanie formularzy, ale HTML5 pozwoli na obejście z atrybutem "form"("właściciel formularza").

Co do HTML 4.x Można:

  1. użyj dodatkowego formularza z ukrytymi polami i JavaScript, aby ustawić jego dane wejściowe i przesłać formularz.
  2. użyj CSS, aby ustawić kilka formularzy HTML tak, aby wyglądały jak jedna jednostka - ale myślę, że to zbyt trudne.
 21
Author: Nishi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-13 21:59:15

Jak mówili inni, to nie jest poprawny HTML.

Wygląda na to, że robisz to, aby umieścić formy wizualnie wewnątrz siebie. Jeśli tak jest, po prostu wykonaj dwa oddzielne formularze i użyj CSS do ich pozycjonowania.

 13
Author: user64075,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-17 08:47:29

Nie, Specyfikacja HTML stwierdza, że żaden FORM element nie powinien zawierać innego FORM elementu.

 7
Author: David Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-27 10:08:17

Raczej używaj niestandardowej metody javascript wewnątrz atrybutu action formularza!

Eg

<html>
    <head>
        <script language="javascript" type="text/javascript">
        var input1 = null;
        var input2 = null;
        function InitInputs() {
            if (input1 == null) {
                input1 = document.getElementById("input1");
            }
            if (input2 == null) {
                input2 = document.getElementById("input2");
            }

            if (input1 == null) {
                alert("input1 missing");
            }
            if (input2 == null) {
                alert("input2 missing");
            }
        }
        function myMethod1() {
            InitInputs();
            alert(input1.value + " " + input2.value);
        }
        function myMethod2() {
            InitInputs();
            alert(input1.value);
        }
        </script>
    </head>
    <body>
        <form action="javascript:myMethod1();">
            <input id="input1" type="text" />
            <input id="input2" type="text" />
            <input type="button" onclick="myMethod2()" value="myMethod2"/>
            <input type="submit" value="myMethod1" />
        </form>
    </body>
</html>
 6
Author: Andreas Niedermair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-17 08:56:31

Nie, zobacz w3c

 5
Author: tliff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-17 08:37:33

Możesz bardzo łatwo odpowiedzieć na swoje pytanie, wprowadzając kod HTML do walidatora w3. (Posiada pole wprowadzania tekstu, nie musisz nawet umieszczać kodu na serwerze...)

(i nie, to się nie sprawdzi.)

 5
Author: Christian Studer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-17 08:41:17

Istnieje możliwość posiadania ramki iframe wewnątrz zewnętrznej formy. Ramka iframe zawiera wewnętrzną formę. Upewnij się, że używasz znacznika <base target="_parent" /> wewnątrz znacznika head w ramce iframe, aby formularz zachowywał się jako część strony głównej.

 5
Author: Robin Manoli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-27 17:19:24

Nie, to nie jest ważne. Ale "rozwiązaniem" może być stworzenie okna modalnego poza formularzem " a "zawierającego formularz "b".

<div id="myModalFormB" class="modal">
    <form action="b">
        <input.../>
        <input.../>
        <input.../>
        <button type="submit">Save</button>
    </form>
</div>

<form action="a">
    <input.../>
    <a href="#myModalFormB">Open modal b </a>
    <input.../>
</form>

Można to łatwo zrobić, jeśli używasz Bootstrap lub zmaterializuj css. Robię to, aby uniknąć używania iframe.

 1
Author: Jonathas Hortense,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-06 17:41:41

Jeśli potrzebujesz swojego formularza, aby przesłać / zatwierdzić dane do relacyjnej bazy danych 1:M, polecam utworzenie wyzwalacza DB "after insert" w tabeli a, który wstawi niezbędne dane dla tabeli B.

 0
Author: cbWrites,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-24 15:17:41