2009-01-06 55 views
26

我刚刚发现(困难的方法),当您有一个带有action=""的HTML表单时,Webkit浏览器将它与Firefox和Internet Explorer区别开来。Forms with action =“”

在FF和IE浏览器,这两种形式的标签是等价的:

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

<form method="post"> 

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

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

这看起来很混乱,并不是做事的最佳方式。任何人都可以提出更好的方法?另外,任何人都可以启发我为什么Webkit会做这样的事情?

+0

这个/显然是作为针对webkit [这里](https://bugs.webkit.org/show_bug.cgi?id=7763) – 2009-03-05 02:53:54

回答

6

在我看来,最好的办法不是省略action属性(不会验证),而是指定表单的实际行为。是否有一个原因,你没有指定的行动?

+3

的错误提交的,它是一个在许多页面上的通用表单,其中一些可以有一系列的GET参数。我发现执行action =“”比重新创建URL并对其进行正确编码要容易得多。 – nickf 2009-01-06 02:42:07

+0

我实际上有一个帮助器,它解析url参数并相应地重新创建它,这是我在大多数项目中使用的。你在使用路由器模式吗?如果您的网址具有可预测的语义并且可以轻松分解,它确实有帮助。 – 2009-01-06 02:49:37

+0

如果您告诉我们关于您的环境的更多信息,可能会有一个特定的答案,例如,在django中这样做很容易,通常使用`action =“{{request.path}}”`来获得同样的效果。 – SingleNegationElimination 2010-09-28 08:32:44

27

我通常使用

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

这意味着当前的URL,但不带任何参数。

+1

我这样做,除了我使用双引号符合XHTML。 =] – strager 2009-03-05 02:37:51

2

我一直使用(在PHP)

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

为了让我的形式提交自己。

10

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

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

编辑好吧,这其实是WebKit的一个归档的bug 528+(见Bug 19884)当使用BASE元素将空URI与指定的基本URI一起使用时。在这种情况下,WebKit采用基本URI而不是从基本URI解析空的URI。

但这correct behavior according to RFC 3986

5.1。建立基本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具有比用于检索实体更高的优先级。所以WebKit的行为实际上是根据RFC 3986.

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中成为一个事实上的标准。