如果XHTML不允许嵌套表单,那么这是如何/为什么验证?这段代码可以使用吗?

时间:2015-02-12 22:30:33

标签: html forms xhtml

我正在一个网页上工作,该网页列出了数据库中的几个租借预订。我想我可能已经把自己建在了一个角落里。我最初每排有3个单元格,每个单元格包含一个由2或3个隐藏字段组成的小字体,以及一个按钮,用于编辑","返回"或"取消"预订。

那些工作正常,并且都是有效的,因为每个整个表单都在一个单元格内。

现在我需要添加功能以允许选择多行,并将它们传递到另一个页面。所以不假思索地,我添加了一个围绕整个表格的<form>,为每一行添加了一个复选框,并在表格的底部添加了一个提交按钮。

经过一些研究,我非常确定XHTML中不允许使用嵌套表单。但该文件仍然以某种方式验证了W3C验证器。我正在使用XHTML 1.0 Transitional。也许是因为它不是<form>直接位于另一个<form>内,而是<form>位于<table>内的<form>?这是允许的吗?

表单按原样运行(它从顶行提交了一些额外的字段,但如果必须,我可以忽略它们。)

我只是害怕实施这个,因为我觉得这样做是不对的。如果有人能澄清这是否有效我会非常感激。如果不是,你有什么建议来解决它吗?

提前致谢!

<form id="form2" name="form2" method="post" action="pickup.php">
    <table width="1200" border="1" align="center" cellpadding="5" cellspacing="0" style="border-collapse:collapse; border-color:#CCC;">
        <tr>
            <td colspan="10" bgcolor="#CCCCCC"><h2>Equipment Being Picked Up Today</h2></td>
        </tr>
        <tr class="highlight">
            <td><input type="checkbox" name="res1" id="res1" value="2278" /></td>
            <td>George Washington</td>
            <td>555-333-4444</td>
            <td><a href="product.php?sku=R6209" target="_self">Lghting kit 6209</a></td>
            <td>2/12/15</td>
            <td>2/13/15</td>
            <td></td>
            <td align="center">
                <form name="editForm" method="post" action="edit.php">
                    <input name="editFrom" type="hidden" value="today2.php" />
                    <input name="theDate" type="hidden" value="2015-02-12" />
                    <input name="reservationID" type="hidden" value="2278" />
                    <input type="submit" name="edit" value="edit" />
                </form>
            </td>
            <td align="center">
                <form name="returnForm" method="post" action="today2.php">
                    <input name="reservationID" type="hidden" value="2278" />
                    <input name="return" type="hidden" value="yes" />
                    <input name="theDate" type="hidden" value="2015-02-12" />
                    <input type="submit" value="return" />
                </form>
            </td>
            <td align="center">
                <form name="cancelForm" method="post" action="cancel.php">
                    <input name="editFrom" type="hidden" value="today2.php" />
                    <input name="theDate" type="hidden" value="2015-02-12" />
                    <input name="reservationID" type="hidden" value="2278" />
                    <input type="submit" name="cancel" value="cancel" />
                </form>
            </td>
        </tr>
        <tr class="highlight">
            <td><input type="checkbox" name="res2" id="res2" value="2279" /></td>
            <td>Sam Adams</td>
            <td>333-222-7777</td>
            <td><a href="product.php?sku=R8300" target="_self">camera kit 3456</a></td>
            <td>2/12/15</td>
            <td>2/13/15</td>
            <td></td>
            <td align="center">
                <form name="editForm" method="post" action="edit.php">
                    <input name="editFrom" type="hidden" value="today2.php" />
                    <input name="theDate" type="hidden" value="2015-02-12" />
                    <input name="reservationID" type="hidden" value="2279" />
                    <input type="submit" name="edit" value="edit" />
                </form>
            </td>
            <td align="center">
                <form name="returnForm" method="post" action="today2.php">
                    <input name="reservationID" type="hidden" value="2279" />
                    <input name="return" type="hidden" value="yes" />
                    <input name="theDate" type="hidden" value="2015-02-12" />
                    <input type="submit" value="return" />
                </form>
            </td>
            <td align="center">
                <form name="cancelForm" method="post" action="cancel.php">
                    <input name="editFrom" type="hidden" value="today2.php" />
                    <input name="theDate" type="hidden" value="2015-02-12" />
                    <input name="reservationID" type="hidden" value="2279" />
                    <input type="submit" name="cancel" value="cancel" />
                </form>
            </td>
        </tr>
        <tr class="highlight">
            <td><input type="checkbox" name="res3" id="res3" value="2280" /></td>
            <td>Bob Dole</td>
            <td>111-222-4444</td>
            <td><a href="product.php?sku=R8609" target="_self">Other item 6789</a></td>
            <td>2/12/15</td>
            <td>2/13/15</td>
            <td></td>
            <td align="center">
                <form name="editForm" method="post" action="edit.php">
                    <input name="editFrom" type="hidden" value="today2.php" />
                    <input name="theDate" type="hidden" value="2015-02-12" />
                    <input name="reservationID" type="hidden" value="2280" />
                    <input type="submit" name="edit" value="edit" />
                </form>
            </td>
            <td align="center">
                <form name="returnForm" method="post" action="today2.php">
                    <input name="reservationID" type="hidden" value="2280" />
                    <input name="return" type="hidden" value="yes" />
                    <input name="theDate" type="hidden" value="2015-02-12" />
                    <input type="submit" value="return" />
                </form>
            </td>
            <td align="center">
                <form name="cancelForm" method="post" action="cancel.php">
                    <input name="editFrom" type="hidden" value="today2.php" />
                    <input name="theDate" type="hidden" value="2015-02-12" />
                    <input name="reservationID" type="hidden" value="2280" />
                    <input type="submit" name="cancel" value="cancel" />
                </form>
            </td>
        </tr>
        <tr>
            <td colspan="10">
                <input type="submit" name="submit" id="submit" value="Pickup Selected Equipment" />
            </td>
        </tr>
    </table>
</form>

1 个答案:

答案 0 :(得分:3)

验证是因为XHTML 1.0的正式验证基于XML规则,而XML是SGML的一种强烈简化的修改,这是HTML 4.01名义上的基础。因此,在基于XML的DTD中描述的XHTML 1.0 的形式语法不禁止在所有HTML版本中禁止的某些功能(如嵌套表单)。 specification说明如下:

  

SGML为DTD的编写者提供了排除特定的能力   元素包含在元素中。这样的禁令   (称为“排除”)在XML中是不可能的。

     

例如,HTML 4 Strict DTD禁止嵌套'a'   任何后代深度的另一个'a'元素内的元素。它不是   可以用XML来说明这种禁令。即使这些   禁止在DTD中定义,某些元素不应该   嵌套。这些元素的摘要和不应该的元素   嵌套在它们中的可以在规范的元素禁令中找到。

Element Prohibitions表示form元素不得包含其他form元素。

嵌套表单是不安全的。没有说明如果你这样做会发生什么。例如,未指定在提交外部表单时是否应包含内部表单上的字段。

因此,您应该考虑重构页面,以避免表单嵌套。如果您需要有关此方面的帮助,请考虑发布一个指定所需功能的新问题,并显示您最佳的重组尝试。