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 实际上应该包含methodAttr 节点,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”。如何判断它是用户输入的还是默认的?的主要内容,如果未能解决你的问题,请参考以下文章

Flask表单验证

JSP表单处理

Servlet学习笔记:表单数据

laravel的控制器如何判断是post提交还是get提交?

在 IE7 或 IE8 中使用表单元素获得统一的布局

多用户留言板