如果用户创建没有方法属性的表单,似乎大多数浏览器会在表单提交时处理此问题。因此,在DOM准备好之后检查表单元素时,您可以看到表单元素对象没有“方法”attr。
但是,IE7显然在没有方法值的所有表单上设置了“GET”的默认方法值。我不想争论GET或POST是否是最合理的默认值,我只是想找到一种方法使POST成为所有浏览器的默认表单方法。我的问题是我无法判断用户是否为表单方法输入了“GET”值,或者IE是否将该值注入默认值。如果表单没有方法属性,很明显用户没有指定一个,所以我可以安全地将其默认为POST。但是如果我看到一个表单方法的GET值,我无法判断用户是否指定了该值,或者它是否为黑色并且IE7在解析HTML时设置了GET。
有人有什么想法吗?
答案 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