哲学问题:
假设我有一个需要使用JavaScript和现代浏览器的Web应用程序,因此渐进增强不是问题。如果我的表单是通过JavaScript构建的,并且我的数据更新都是通过ajax POST和PUT完成的,那么真的有必要在控件周围包装form标签吗?如果我仍然要使用标签,例如出于语义或结构原因,是否有必要有我将要忽略的action和method参数?对我来说,这感觉像是早期时代的一种遗留问题。
哲学问题:
假设我有一个需要使用JavaScript和现代浏览器的Web应用程序,因此渐进增强不是问题。如果我的表单是通过JavaScript构建的,并且我的数据更新都是通过ajax POST和PUT完成的,那么真的有必要在控件周围包装form标签吗?如果我仍然要使用标签,例如出于语义或结构原因,是否有必要有我将要忽略的action和method参数?对我来说,这感觉像是早期时代的一种遗留问题。
将输入框包含在
return false
并不能取消实际的提交。只有使用 e.preventDefault()
(其中 e
是提交事件)才能真正取消提交。请参见 https://dev59.com/nFkS5IYBdhLWcg3wdmrC#39841238。 - João Fé如果您不需要渐进增强,理论上就不需要它们。
另一方面,form
具有一些很酷的分组和语义效果。使用它们,您可以逻辑地分组表单元素,并使脚本更容易收集某些元素的值。
例如,如果您想要ajax提交某些用户输入,总是比较容易说:“让我们把这个表单中的所有元素提交”而不是“让我们把这个输入、这两个选择和这三个文本区域提交”。根据我的经验,form
标签实际上对开发人员有所帮助。
<form>
设置为包装器,当尝试从表单的输入选项中获取特定值时,您可能会在操作时互相干扰,因为很容易出现值为1
、2
、3
等的情况。 - pspahnAJAX很棒,但正如JamWaffles所说,使用form
标签可以提供备选方法。
个人而言,即使对于我用AJAX提交的东西,我也使用表单标签,因为它在语法上是清晰的,容易获取特定表单中的所有输入。是的,你也可以用div
或其他标签来做到这一点,但正如我所说,使用表单在语法上更加优雅。
顺便说一下,屏幕阅读器会以不同的方式处理form
内的内容,所以无论你采取哪种方式,都需要考虑可访问性问题。请注意,有传言称Google在其排名中考虑可访问性,因此如果SEO是您关心的问题,请使用表单并正确操作。
摘要: 对于MVC、简单的Web应用程序而言,表单是可以使用的;但对于组件化、丰富的Web应用程序而言,表单就不太适合了。
原因: 表单不能嵌套其他表单:这对于面向组件的架构来说是一个很大的限制。
详情: 对于典型的MVC应用程序,表单非常适用。但在使用大量JavaScript和AJAX以及各种组件的复杂Web应用程序中,我不喜欢使用表单。原因是表单不能嵌套其他表单。如果每个组件都渲染一个表单,那么组件之间就无法嵌套。这太糟糕了。通过将所有表单更改为div,我可以嵌套它们,并且每当我想要获取所有参数以便将它们传递给ajax时,我只需执行以下操作(使用jQuery):
$("#id_of_my_div").find("[name]").serialize();
(或一些其他过滤器)
而不是:
$("#id_of_my_form").serialize();
尽管出于情感和语义原因,当我的div充当表单时,我仍然会将它们命名为something_form。
<form>
标签。我正在构建一个使用<form>
的Web应用程序,但我使用它们是为了在用户禁用JavaScript时有一个备用方法(e.preventDefault
可以阻止表单正常提交)。对于你的情况,你说用户必须启用JavaScript,所以不需要使用<form>
标签,但是保留它可能是个好主意,以防浏览器需要做任何事情,或者作为一种类访问它。<form>
,但是如果你突然决定创建回退代码,保留它可能是个好主意。个人认为:如果您出于语义原因使用它,那么请按照预期使用它。动作属性是必需的(也可以留空),以便格式正确,还可以通过设置操作属性并在ajax调用之前读取来将URI与js逻辑分开。
我不明白为什么你需要在这里使用表单标签。除了让你的标记验证通过之外,唯一使用表单标签的原因是如果你将使用提交输入或按钮标签“提交”数据。如果你不需要这样做,那么就没有必要使用表单了。但是,不确定它是否被视为“有效”的标记。如果你确实需要使用它,你可以只写 <form action="">
,因为action是表单标签的唯一必需属性。然而,你提出了一个很好的观点:未来的网络应用程序可能不再需要表单和传统的提交方法。非常有趣,让我感到高兴。呵呵:)