[英]IE9 Double Form Submit Issue
我只是想知道是否有人对我所处的情况有一些信息或反馈。目前我正面临“双表提交”问题,我点击“提交”按钮一次,然后提交表格两次。 这只发生在IE9中,但我只针对Safari,Chrome(最新),FF(Ver 5/6),IE8和IE9进行了测试。
这是代码:
<!DOCTYPE html>
<html lang="en-us" dir="ltr">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" >
<title>IE9 test</title>
</head>
<body>
<h1>Testing</h1>
<form method="POST" id="submit_form">
<input type="text" name="x" value="xxxx" />
<input type="text" name="y" value="yyyy" />
<button type="submit" class="btn_sign_in" id="btn_logon" onclick="this.disabled=true;document.forms[0].submit();">Submit</button>
</form>
</body>
</html>
有问题的部分是:
onclick="this.disabled=true;document.forms[0].submit();"
代码已经在我的网站上存在了很长时间,这是我第一次遇到双提交问题,因为IE9今年才发布,可能这些天越来越多人使用IE9,因此我收到用户对这个问题的抱怨。
最难的部分是双重提交问题并不总是可重现的。 有时会提交双倍,有时会提交一次。
我目前的工作是改变:
<meta http-equiv="X-UA-Compatible" content="IE=edge" >
并改为:
<meta http-equiv="X-UA-Compatible" content="IE=8" >
这迫使IE9使用IE8兼容性,它将正确执行Javascript以进行提交。
我已经打电话给微软支持,他们声称这是一个“Javascript兼容性问题”,所以我们需要微调我们的Javascript以使我们的网站在IE9下正常工作..(Duh!)
无论如何,是我的代码:
onclick="this.disabled=true;document.forms[0].submit();"
开始已经错了? 因为即使其他浏览器没有抱怨,但可能这是不正确的开始?
我希望如果有人也面临类似问题,可以获得更多信息或反馈。 目前,如果我不将X-UA-Compatible更改为IE = 8,我可以将我的代码更改为:
onclick="this.disabled=true;"
这也将解决双重提交问题,但是还有一个我们应该注意的IE9兼容性问题列表吗?
谢谢!
这段代码错了:
onclick="this.disabled=true;document.forms[0].submit();"
onclick Javascript不保证正常提交也不会执行。 为此,它需要返回false,如下所示:
onclick="this.disabled=true;document.forms[0].submit(); return false;"
这种行为的改变是IE9的错误吗? 这取决于,这可能取决于时间问题导致的法律行为。 如果DOM / Javacript标准保证document.submit()是文档中所有执行的结束,那么这只是一个错误。 我怀疑是这种情况。
抽象出复杂性,问题似乎是IE9在javascript中触发提交事件时, 只需单击一次按钮即可提交两次表单 。
一般来说,我发现这样做修复了IE9双表单提交问题:
(IE9双提交HTML失败):
<input type="submit" />
(IE9 html双提交修复):
<input type="submit" onclick="return false; " />
所以基本上,我正在使用事件监听器(单击)处理javascript(未显示)中的表单提交,但是在旧的学校事件处理程序(onclick)上返回false,IE9似乎自动调用它,即使您已经通过事件监听器。
我猜你可以在纯javascript中做同样的事情:
inputElement.onclick = function(){ return false; };
但我没有测试它。
当你使用
onclick="document.forms[0].submit();"
在提交按钮上,写入input type="button"
而不是type="submit"
,
因为你已经有了执行.submit()的代码,为什么不将按钮类型更改为简单按钮而不是提交?
我不确定这是否是问题,但是,翻译成简单的英语,您的代码似乎在说“单击提交按钮,将disabled属性设置为true,然后提交表单。”
但是,由于单击提交按钮已经提交了表单,因此您的浏览器可能会收到两个提交请求 - 一次是您单击按钮,第二次是您的javascript告诉它提交。
如果你没有做ajax,只是常规提交,你应该能够return true
而不是调用submit
- 本质上,告诉浏览器继续执行默认操作(即提交)。
或者真的,完全杀死整个submit()
部分,因为它是多余的。
部分问题是我相信你提交了两次。 您需要在开始第二个事件之前停止第一个事件。 有关使用内联javascript停止事件的更多信息,请参阅此帖子: 如何使用内联onclick属性停止事件传播?
我们在IE9中遇到了同样的问题,我们通过将event的cancelBubble和returnValue标志分别设置为true和false来解决了这个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.