Web 辅助功能 - 控件提交按钮不在 <form> 中是否正确 HTML 结构?

Web Accessibility - Control submit button not in the <form> is correct HTML structure?

我在该项目上遵循 WCAG 2.1 A 级,并希望工作出色“没有 JavaScript” 包含任何 <form> 元素。

这是我的示例代码:

// cart.html

<div class="wrapper">
    <!-- Form A -->
    <form action="checkout-step1.html">
        <h2>A form</h2>
        <label for="input1">input1</label>
        <input type="text" name="input1" id="input1" value="Cart Data">
        <input type="hidden" name="coupon-use" value="XXXXXX">
        <!-- Hide Submit Button -->
        <button id="btnCheckout" type="submit" style="display: none;">Checkout Cart</button>
    </form>

    <!-- Form B -->
    <form action="cart.html">
        <h2>B form</h2>
        <label for="coupon">coupon</label>
        <input type="text" name="coupon" id="coupon" value="CouponId">
        <button class="btn" type="submit">use</button>
        <div>
            <!-- Use label to submit another form -->
            <label class="btn" for="btnCheckout">Checkout</label>
        </div>
    </form>
</div>

我用了 Google 灯塔,The W3C Markup Validation Service, WAVE Web Accessibility Evaluation Tool 验证页面。有些东西看起来不错,但得到了一些关于 label 的警报,该 label 在工具 WAVE 上控制另一个表单提交。

Orphaned form label

A form label is present, but it is not correctly associated with a form control.

我可以使用该标签提交另一个 <form> 吗?这是正确的 HTML 结构吗?

简答

为了在没有 JavaScript 的情况下工作,您需要将所有内容移动到一个表单中,或者您需要在服务器端处理所有内容并单独提交表单。

我可以使用该标签提交另一个吗?这是正确的 HTML 结构吗?

错误是因为您在两个表单之间发送信息,如果一个表单中的标签指向另一个表单,那么它在技术上是无效的。

此外,我以前从未见过与按钮关联的标签,但令我惊讶的是它是有效的 HTML。再说一次,这不是预期的(我会阅读并查看是否可以找到关于标签是否对按钮有效的明确指导)。

无论你在技术上如何做到这一点,我的意思是,它有效(令人惊讶)但这不是一个好的做法。

不过还有更大的问题。

用户不能一开始就点击标签,而且标签提交表单也是意想不到的行为(预期行为是可访问性的很大一部分)。同样按“enter”提交表单将不起作用,因为您没有第二个表单的提交按钮,所以这是更多缺失的行为。

如果您的提交按钮是 display:none,则无法访问,这是您需要更正的另一个问题。

最后即使提交了第一个表单,没有JavaScript也无法获取到第二个表单信息。

选项 1

让一切成为一种形式。这样当您提交表单时,所有内容都会一起发送。

这是迄今为止最简单、最简洁的方法,但显然您可能需要为此稍微重新设计。

选项 2

在服务器端处理多个表单提交。

您必须在服务器上设置会话才能正确关联这两个表单。

在第一个表单上,您必须有一个复选框,上面写着“我有一张优惠券要使用”,并且最初隐藏第二个表单。

然后当提交第一个表单时,如果未选中此复选框,您将不得不将它们路由到下一个结帐页面,或者将它们路由回同一页面,这次显示优惠券部分。

重新填写第一个表单(所有表单 disabled)以便他们可以看到他们的信息是正确的并隐藏该表单上的提交按钮。

然后当他们提交优惠券表格时使用您的会话 ID 来匹配数据并重定向到新页面。


如您所见,第二个选项混乱且充满问题(例如,您需要一个后退按钮,以便他们可以编辑初始表单)。

我会把所有东西都放在一个表格里。