以下是有效的html:

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

当你提交b时,你只能得到内部表单中的字段。当你提交“a”时,你会得到所有字段减去“b”内的字段。

如果不可能,对于这种情况有什么可行的变通办法?


当前回答

不,HTML规范规定任何FORM元素都不应该包含另一个FORM元素。

其他回答

答:它不是有效的HTML或XHTML

在官方W3C XHTML规范的B节中。“元素禁令”规定:

"表单不能包含其他表单元素。"

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

对于旧的HTML 3.2规范, 关于FORMS元素的部分声明:

"每一份表格都必须用 表单元素。可以有几个 表单放在单个文档中,但是 FORM元素不能嵌套。

B.解决方案

有一些使用JavaScript而不需要嵌套表单标记的变通方法。

“如何创建嵌套表单。”(尽管title不是嵌套的表单标签,而是JavaScript的解决方案)。

这是StackOverflow问题的答案

注意:尽管可以通过脚本操纵DOM来欺骗W3C验证器来传递页面,但它仍然不是合法的HTML。使用这种方法的问题是,现在无法保证跨浏览器的代码行为。(因为不是标准)

而是在表单的action属性中使用自定义javascript方法!

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>

如果有人发现这篇文章是一个不需要JS的伟大解决方案。使用两个具有不同名称属性的提交按钮,在您的服务器语言中检查哪个提交按钮被按下,因为只有一个将被发送到服务器。

<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>

如果你使用php,服务器端看起来是这样的:

<?php
    if(isset($_POST['save']))
        echo "Stored!";
    else if(isset($_POST['delete']))
        echo "Deleted!";
    else
        echo "Action is missing!";
?>

通过将HTML代码输入W3 Validator,您可以非常容易地回答自己的问题。(它有一个文本输入域,你甚至不需要把你的代码放在服务器上…)

(不,它不会生效。)

不,这是无效的。但是一个“解决方案”可以是在窗体“a”之外创建一个包含窗体“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>

如果你使用bootstrap或materialize css,这很容易做到。 我这样做是为了避免使用iframe。