表格有动作=“”

时间:2009-01-06 02:30:44

标签: html forms

我刚刚发现(困难的方法),当你有一个带有action=""的HTML表单时,Webkit浏览器会以不同的方式对待Firefox和Internet Explorer。

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

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

<form method="post">

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

我很快就攻击了我的代码,以便在通常打印空操作的任何地方,它根本不添加动作属性。

这看起来非常混乱,而不是做事的最佳方式。有谁能建议更好的方法?另外,任何人都可以告诉我为什么Webkit会做这样的事情吗?

4 个答案:

答案 0 :(得分:27)

我通常使用

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

这意味着当前网址但没有参数。

答案 1 :(得分:11)

action attribute is required但您可以指定引用当前URI的空URI引用:

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

编辑好的,当使用BASE元素将空URI与指定的基URI一起使用时,这实际上是WebKit 528+(参见Bug 19884)的归档错误。在这种情况下,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)         |
  `----------------------------------------------------------'

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

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

  

如果操作是空字符串,请将操作设为document'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的bug,它成为事实上的标准。

答案 2 :(得分:6)

我认为最好的方法是不要省略action属性(不会验证),而是指定表单的实际操作。您是否有理由不指定行动?

答案 3 :(得分:2)

我一直使用(在PHP中)

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

让我的表单提交给自己。