【问题标题】:Can I have a form input that doesn't get serialized/submitted on form submission without JS? [duplicate]在没有 JS 的情况下,我可以有一个在表单提交时不会序列化/提交的表单输入吗? [复制]
【发布时间】:2021-12-10 20:47:54
【问题描述】:

假设我有一个这样的表单:

<form id="something_form">
  <input type="text" id="thing1" name="thing1">
  <input type="hidden" id="thing2" name="thing2">
  <input type="text" id="secret" name="secret">

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

目前我有 JS 监听提交事件,获取 secret 输入中的信息,并在将其添加到 thing2 之前做一些工作。服务器从不使用或不需要secret。我可以在提交表单之前清除secret中的数据,所以它只是thing1=abc&amp;thing2=abc&amp;secret=,但是如果用户关闭了JS,那么表单提交请求将有thing1=abc&amp;thing2=&amp;secret=secret

是否有一种纯 HTML 方法可以使输入正常工作,但不会在表单提交时序列化/提交?我知道我可以删除 name="secret" 来实现这一点,但这会让我失去任何依赖 name 属性的功能。

我的解决方案是在没有name="secret" 的情况下呈现页面:

<input type="text" id="secret">

然后通过JS添加(因为如果用户打开了JS,它会运行):

document.getElementById("secret").setAttribute("name", "secret");

但我很好奇是否有其他解决方案。

【问题讨论】:

    标签: html


    【解决方案1】:

    一种选择是使用form 属性。具有form 属性集的输入算作其 ID 与其form 属性匹配的表单的一部分,而不是它实际所在的表单的一部分。

    示例:&lt;input type="text" name="fish" form="bogus"&gt; 不会与表单的其余部分一起提交,除非表单出于某种原因具有 id="bogus"

    【讨论】:

    • 关于链接副本的一条评论确实提到这是(或曾经是)无效的 HTML。这可能不是一个实际问题,但您也可以考虑省略 name 属性,这显然可以实现相同的目标。
    • 省略 name 完全会导致我正在使用的现有 JS 库出现问题,这就是为什么我认为在没有 name attr 的情况下进行渲染,但在通过 JS 加载页面时添加 name attr 会解决它,但如果可能的话,我通常更喜欢非 JS 解决方案。所以这比我的解决方案要好得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2015-06-12
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多