【问题标题】:Forms with action=""带有 action="" 的表单
【发布时间】:2009-01-06 02:30:43
【问题描述】:

我刚刚发现(很难),当您有一个带有action="" 的 HTML 表单时,Webkit 浏览器对它的处理方式与 Firefox 和 Internet Explorer 不同。

在FF和IE中,这两个表单标签是等价的:

<form method="post" action="">

<form method="post">

他们都会将表单提交回同一页面。然而,Safari 和 Chrome 会将第一个表单发送到默认页面(index.php 或其他) - 第二个表单的工作方式与 FF/IE 相同。

我已经快速破解了我的代码,以便在通常打印空操作的任何地方,它根本不会添加操作属性。

这似乎很混乱,不是最好的做事方式。任何人都可以提出更好的方法吗?另外,谁能告诉我为什么 Webkit 会做这样的事情?

【问题讨论】:

  • 这显然已经/被作为针对 webkit here的错误提交

标签: html forms


【解决方案1】:

我经常用

<form method='POST' action='?'>

这表示当前的 URL,但没有参数。

【讨论】:

  • 我这样做了,但我使用双引号符合 XHTML。 =]
  • 你可以使用单引号并且仍然有有效的 XHTML;您不必使用双引号。
  • 哦,我的错。我一定是误解了标准比。无论如何,我更喜欢双引号。
  • 其实我以为是反过来的。没关系。
【解决方案2】:

action attribute is required 但你可以指定一个空的 URI 引用来引用当前的 URI:

<form method="POST" action="">

编辑    好的,这实际上是 WebKit 528+(请参阅 Bug 19884)的一个已提交错误,当空 URI 与使用 BASE 元素的指定基本 URI 一起使用时。在这种情况下,WebKit 采用基本 URI,而不是从基本 URI 解析空 URI。

但这是correct behavior according to RFC 3986:

5.1。建立基础 URI

术语“相对”意味着存在一个“基本 URI” 应用相对参考。 […]

引用的基本 URI 可以通过以下四种方式之一建立, 下面按优先顺序讨论。优先顺序可以 可以根据层来考虑,其中最里面定义的基础 URI 具有最高优先级。这可以以图形方式可视化 如下:

  .----------------------------------------------------------.
  |  .----------------------------------------------------.  |
  |  |  .----------------------------------------------.  |  |
  |  |  |  .----------------------------------------.  |  |  |
  |  |  |  |  .----------------------------------.  |  |  |  |
  |  |  |  |  |       <relative-reference>       |  |  |  |  |
  |  |  |  |  `----------------------------------'  |  |  |  |
  |  |  |  | (5.1.1) Base URI embedded in content   |  |  |  |
  |  |  |  `----------------------------------------'  |  |  |
  |  |  | (5.1.2) Base URI of the encapsulating entity |  |  |
  |  |  |         (message, representation, or none)   |  |  |
  |  |  `----------------------------------------------'  |  |
  |  | (5.1.3) URI used to retrieve the entity            |  |
  |  `----------------------------------------------------'  |
  | (5.1.4) Default Base URI (application-dependent)         |
  `----------------------------------------------------------'

在这种情况下,带有href 属性的BASE 元素是嵌入在内容中的基本URI。并且 嵌入在内容中的基本 URI 比用于检索实体的 URI 具有更高的优先级。所以 WebKit 的行为实际上是根据 RFC 3986 的预期行为。

in HTML 5 this behavior of an empty URI in form’s action(仍是草案)与 RFC 3986 不同:

如果 action 是空字符串,则让 actiondocument's address

注意:此步骤是 RFC 3986 的 willful violation,需要在此处处理基本 URL。这种违规的动机是希望与遗留内容兼容。 [RFC3986]

坦率地说,源代码中此注释之后的 HTML 注释如下:

<!-- Don't ask me why. But that's what IE does. It even treats
action="" differently from action=" " or action="#" (the latter
two resolve to the base URL, the first one resolves to the doc
URL). And other browsers concur. It is even required, see e.g.
  http://bugs.webkit.org/show_bug.cgi?id=7763
  https://bugzilla.mozilla.org/show_bug.cgi?id=297761
-->

所以这是一个源自 Internet Explorer 的错误,后来成为事实上的标准。

【讨论】:

  • ...除了在 Webkit 浏览器中不起作用,如 OP 中所述。
  • 第二个例子也不是有效的 HTML。
  • 嗯,不,但它确实有效,这一点更重要。
  • 从 FF 52.9 升级到 61.0 时,这只是我的企业。我将其缩小为原因,但没有查找 HTML 或 RFC 标准。感谢您提供背景信息,并确认我的发现。
【解决方案3】:

在我看来,最好的方法是不要省略 action 属性(不会验证),而是指定表单的实际操作。您没有指定操作是否有原因?

【讨论】:

  • 它是一个通用表单,存在于许多页面中,其中一些可能有一系列 GET 参数。我发现执行 action="" 比重新创建 URL 并正确编码要容易得多。
  • 我实际上有一个帮助器来解析 url 参数并相应地重新创建它,我在大多数项目中都使用它。你在使用路由器模式吗?如果您的 URL 具有可预测且可以轻松分解的语义,这真的很有帮助。
  • 如果你告诉我们更多关于你的环境的信息,可能会有一个具体的答案可以让这很容易,例如,在 django 中,action="{{ request.path }}" 通常足以获得相同的效果。
【解决方案4】:

我一直使用(在 PHP 中)

<form method="post" action="<?php echo htmlspecialchars($_SERVER['REQUEST_URI']); ?>">

让我的表单提交给他们自己。

【讨论】:

  • 正如我已经说过的:使用htmlspecialchars() 而不是striptags()
猜你喜欢
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 2017-03-06
  • 2010-12-24
  • 2019-03-05
  • 2012-05-19
  • 1970-01-01
相关资源
最近更新 更多