在 display:none 元素内提交表单字段

IT技术 javascript css forms
2021-01-22 20:31:46

我有一个很长的表格,我已经把它分成了 6 个步骤。当表单被加载时,所有的步骤都被加载,但只有第一步是可见的。其余的有 CSS 的,display:none所以它们是隐藏的。当一个步骤完成并使用 Javascript 验证时,当前步骤设置为display:none,新步骤设置为display:block在最后一步,用户提交表单。但是,正如预期的那样,仅display:block提交页面元素中的字段元素中所有已完成的字段都将display:none被忽略。

有没有办法提交display:none元素内的字段

如果没有,有没有其他方法可以达到同样的效果?

4个回答

将它们设置为visibility:hiddenposition:absolute这些字段不会用 发送到服务器display:none,但会用visibility:hidden通过将“位置”切换为“绝对”,您应该获得相同的视觉效果。

更新这在任何当前浏览器中似乎不再是问题(截至 2015 年 11 月)。即使将显示设置为“无”,也会提交字段。但是,“禁用”的字段将继续不被提交。

Chrome 49 在这里,可以确认在 display:none 中提交输入元素不起作用。
2021-03-19 20:31:46
现在是 1 月 20 日,使用的是最新版本的 Chromium 和 Firefox,但仍然无法发布加载时较早隐藏的字段
2021-03-21 20:31:46
这在当前的任何浏览器中似乎都不是问题。即使将显示设置为“无”,也会提交字段。但是,“禁用”的字段将继续不被提交。
2021-03-31 20:31:46
@Pacerier, yes 会disabled阻止提交值,但在某些较旧的浏览器上,display:none也会有这种效果。请记住,此答案是 4 年前发布的,仅适用于需要为那些较旧浏览器进行开发的开发人员。
2021-04-01 20:31:46
IE8(惊喜!)仍然存在设置为display:none;. 如果该字段上放置了另一个 HTML 元素,则会出现同样的问题。
2021-04-04 20:31:46

HTML4 的第 17.13.2 节明确指出,即使是使用 display:none 的隐藏控件也可能对提交有效。

https://www.w3.org/TR/html401/interact/forms.html

所以如果浏览器忽略 display:none 那么它就不是完全支持 HTML 的。我建议切换到真正的浏览器。

还有谁在这么多网站上放置横幅“是时候升级您的浏览器了”?;-) 我知道了。你不是说“程序员不能告诉访问者使用什么浏览器”——这会侵犯言论自由……你可能是说“雇佣程序员”。行。我的帖子不是很有帮助,因为我只是想指出标准规定的正确行为是什么。而已。
2021-03-19 20:31:46
程序员不能告诉访问者也使用哪个浏览器,而我在最新的 Firefox 中也遇到了同样的问题。尝试显示:无或可见性:隐藏但都不起作用。
2021-03-20 20:31:46
所以看起来它当时不是一些古怪的非 HTML 兼容浏览器。案件结案。
2021-03-22 20:31:46
无论如何,我对可见性:隐藏(甚至可能是显示:无)的评论是无稽之谈,因为我意识到在我的情况下,这是一个错误,或者更确切地说是写入 HTML 标准的疏忽。如果未选中复选框并提交了表单,就好像它甚至不存在一样。它不仅不提交任何内容(请原谅双重否定),而且根本不提交。
2021-03-26 20:31:46

许多旧浏览器存在错误,其中“display:none”以奇怪的方式删除项目......就像2012年之前的Webkit浏览器,其中“display:none”说一个提交按钮,然后按“return”,不会提交表单字段数据到服务器。在旧的 IE 浏览器中,还存在将“display:none”添加到“hidden”类型的输入字段以隐藏它们的情况,但无法将该输入数据发送到服务器。

共识应该始终是不使用“display:none”来隐藏表单字段数据或任何通常不显示的字段,但仍然需要被屏幕阅读器看到,提交表单字段数据,或被阅读搜索引擎。当我真的想暂时从页面中删除某些内容但稍后再次启用它时,我只使用“display:none”

下面是“display:none”的替代方案,它只是在视觉上对用户隐藏项目,并将其从页面流中完全删除,而不隐藏其内容或数据:

.hide {
    position: absolute !important;
    top: -9999px !important;
    left: -9999px !important;
    visibility: hidden !important;
}

如果您发现您的输入没有提交,display: none;并且您希望您的元素不占用空间,那么还有一个我在任何地方都没有看到的选项。

它似乎有效,但前提是您的元素没有子元素。

display: contents;

检查浏览器支持,因为它是一个新的 CSS 功能。