IE7默认表单方法是“GET”。如何判断它是用户输入还是默认?

时间:2010-02-08 23:43:07

标签: javascript internet-explorer dom browser

如果用户创建没有方法属性的表单,似乎大多数浏览器会在表单提交时处理此问题。因此,在DOM准备好之后检查表单元素时,您可以看到表单元素对象没有“方法”attr。

但是,IE7显然在没有方法值的所有表单上设置了“GET”的默认方法值。我不想争论GET或POST是否是最合理的默认值,我只是想找到一种方法使POST成为所有浏览器的默认表单方法。

我的问题是我无法判断用户是否为表单方法输入了“GET”值,或者IE是否将该值注入默认值。如果表单没有方法属性,很明显用户没有指定一个,所以我可以安全地将其默认为POST。但是如果我看到一个表单方法的GET值,我无法判断用户是否指定了该值,或者它是否为黑色并且IE7在解析HTML时设置了GET。

有人有什么想法吗?

3 个答案:

答案 0 :(得分:16)

IE的行为正确!(*)根据DTD:

method      (GET|POST)     GET       -- HTTP method used to submit the form--

或者,在XHTML DTD中:

method      (get|post)     "get"

这意味着如果省略method属性,默认情况下表单不仅提交为GET,而且实际上DOM应包含Attr节点,其中DTD默认为method价值GET

(*:好吧,有点.IE正在HTML文档中使用XHTML小写默认值,它应该是大写的。并不是因为HTML无论如何都不区分大小写,因此它真的很重要。嘿!这是IE比其他所有浏览器更加正确的标准。这是一个奇迹!)

那你怎么告诉Attr节点是因为DTD属性默认而放在那里而不是因为它在源中呢?使用DOM Level 1 Core specified标志:

var form= document.getElementById('myform');
var attr= form.getAttributeNode('method');
var isomitted= attr===null || !attr.specified;

答案 1 :(得分:1)

这似乎没有违反HTML form spec,其中声明:

  

此属性指定哪个HTTP   方法将用于提交表格   数据集。可能(不区分大小写)   值是“get”(默认值)和   “后”。请参阅表格部分   提交使用信息

答案 2 :(得分:0)

(我如何回复特定回复?) (回复bobice:)

  

IE的行为是正确的!

如果我正确阅读了相关的规范,那么在符合要求的实现(IE不是这样)中就是这些:

form.method == "get" /* IETF and W3C HTMLs and XHTMLs */ || form.method == "GET" /* HTML5* */
form.hasAttribute ("method") == false
form.getAttribute ("method") == ""
form.getAttributeNode ("method") == null

在Linux上的Chrome“8.0.552.28 beta”中,我得到(也不正确)

var form = document.createElement ("form")
undefined
form.method == "get" || form.method == "GET"
false /* actual value is "" */
form.hasAttribute ("method") == false
true
form.getAttribute ("method") == ""
false /* actual value is null */
form.getAttributeNode ("method") == null
true
  • 在HTML5中,method是枚举属性,等于GET,POST,PUT,DELETE之一。 form.method必须“反映”方法属性,在枚举属性的情况下,如果它匹配其中一个有效值或第一个有效值,则表示指定值。 (我可能会读到这个稍微有点错误,但那是我的解释。)