IE7 默认表单方法是“GET”。如何判断它是用户输入的还是默认的?
Posted
技术标签:
【中文标题】IE7 默认表单方法是“GET”。如何判断它是用户输入的还是默认的?【英文标题】:IE7 default form method is "GET". How can I tell if it's user-entered or default? 【发布时间】:2011-01-14 14:34:16 【问题描述】:如果用户创建了一个没有方法属性的表单,似乎大多数浏览器都会在提交表单时处理这个问题。所以在 DOM 准备好后检查表单元素,可以看到表单元素对象没有“方法”属性。
然而,IE7 显然在所有没有方法值的表单上设置了默认方法值“GET”。我不想争论 GET 还是 POST 是最明智的默认设置,我只是想找到一种方法让 POST 成为所有浏览器的默认表单方法。
我的问题是我无法判断用户是否为表单方法输入了“GET”值,或者 IE 是否将该值作为默认值注入。如果表单没有方法属性,很明显用户没有指定一个,所以我可以放心地将其默认为 POST。但是,如果我看到表单方法的 GET 值,我无法判断用户是否指定了该值,或者它是否保持黑色并且 IE7 在解析 html 时设置了 GET。
有人有什么想法吗?
【问题讨论】:
我很难相信 IE7 会将默认方法设置为 GET... 但是,我假设您已经测试过了。 @Pekka:确实如此,formElement.getAttribute("method")
将返回 GET
,即使它尚未由 HTML 设置。好消息是 outerHTML 不会返回它。
什么......你想在这里完成什么?我非常怀疑从 HTTP 事务的服务器端将无法判断。但是你为什么想要呢?
WTF 除了破坏应用程序之外,还有其他好处吗?我的意思是,默认设置 GET
而不是 POST
。他们在想什么?
@Pointy 我什至没有在服务器上进行检查,但是您无法从客户端的 HTML 元素中判断 IE 是否设置了默认方法。
【参考方案1】:
IE 的行为是正确的!(*) 根据 DTD:
method (GET|POST) GET -- HTTP method used to submit the form--
或者,在 XHTML DTD 中:
method (get|post) "get"
这意味着如果method
属性被省略,不仅表单默认提交为GET,而且DOM 实际上应该包含method
的Attr
节点,DTD 默认值为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,比我的答案更好,我学到了一些东西。attr
永远不会在 IE 的最后一行出现 null
(至少对于 method
属性),所以您可能只需要使用 !attr.specified
是的,这个想法是为了适应其他浏览器的测试。【参考方案2】:
这似乎不违反HTML form spec,其中规定:
此属性指定哪个 HTTP 方法将用于提交表单 数据集。可能(不区分大小写) 值为“get”(默认值)和 “邮政”。见表格部分 提交使用信息
【讨论】:
把你的引用从代码格式换成块引用,希望你不介意,但是用不同颜色的各种单词看起来有点奇怪:-)【参考方案3】:(如何回复特定回复?) (回复 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 中,方法是一个枚举属性,等于 GET、POST、PUT、DELETE 之一。 form.method 必须“反映”方法属性,在枚举属性的情况下,如果它匹配一个有效值或第一个有效值,则表示指定值。 (我可能读错了,但这是我的解释。)
【讨论】:
以上是关于IE7 默认表单方法是“GET”。如何判断它是用户输入的还是默认的?的主要内容,如果未能解决你的问题,请参考以下文章