我刚刚发现(困难的方法),当你有一个带有action=""
的HTML表单时,Webkit浏览器会以不同的方式对待Firefox和Internet Explorer。
在FF和IE中,这两个表单标签是等价的:
<form method="post" action="">
<form method="post">
他们都会将表格提交回同一页面。然而,Safari和Chrome会将第一个表单发送到默认页面(index.php或其他) - 第二个表单与FF / IE的工作方式相同。
我很快就攻击了我的代码,以便在通常打印空操作的任何地方,它根本不添加动作属性。
这看起来非常混乱,而不是做事的最佳方式。有谁能建议更好的方法?另外,任何人都可以告诉我为什么Webkit会做这样的事情吗?
答案 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']); ?>">
让我的表单提交给自己。