IE浏览器使用Validation Engine表单重复提交问题

本文出处:http://blog.csdn.net/chaijunkun/article/details/8229655,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。


身为一名一直做后端开发的小猿,不务正业去搞前端的东东实在是形势所逼。后端的东西套路越来越清晰,对于典型应用开发,亲爱的开源大神们早就提供了一系列可以使用的工具。公司人手不足,索性前端后端一揽子都包了。HTML、CSS、JS、PS、Java统统自己来搞。这年头不就拼个“综合实力”嘛。这不,前不久就遇到了一个关于IE的JS问题。闲言少叙,下面我先描述一下背景:

页面中包含一个表单,并且使用了jQuery和jQuery的表单验证插件Validation Engine。为了有更好的交互性,想做成异步提交,减少页面刷新。但是因为表单中还含有input type="file"的文件元素。 所以不能使用jQuery的ajax来做提交。只能用form target="oneiframe"来做一个模拟的。

<script type="text/javascript">
	$(document).ready(function() {
		$("#user").validationEngine();
		$("#user").validationEngine('attach',{
			onValidationComplete:function(form, formIsValid){
				if(!$("#agree").is(":checked")){
					alert("请阅读隐私协议并同意我们的条款方可继续");
					return;
				}
				if (formIsValid){
					$("#user").get(0).submit();
					return;
				}
			}
		});
	});
</script>


<iframe name="hiddenFrame" style="display:none;"></iframe>
<form action="updateInfo.do" method="post" enctype="multipart/form-data" id="user" target="hiddenFrame">
	暱称:<input type="text" name="nick" class="validate[required, maxSize[30]]" value="" />
	头像:<input type="file" name="headPic" class="" />
	<input type="checkbox" id="agree" />我同意隐私协议
	<input type="submit" value="提交" />
</form>

上面的代码是我做的一个示例。<script>区域的代码放在<head>内,<body>中有<iframe>和<form>。当点击“提交”按钮时会触发Validation Engine的属性检查功能。从而检查“暱称”字段是否填写,长度是否大于30个字符。为了展示我之前发现的问题,在“我同意隐私协议”复选框中没有使用风格相同的class="validate[required]"来自动验证,而是使用了在表单检查完毕后利用补充代码来验证。

根据Validation Engine的示例(http://code.ciaoca.com/jquery/validation_engine/demo/demos/demoValidationComplete.html)得知,加入了
onValidationComplete:function(form, formIsValid)
回调方法后,validationEngine将不再自动提交(所谓自动提交即顺利通过所有检查后立即执行submit()方法。)问题就出现在了这里。
以上代码中,如果复选框在点击“提交”之前被选中,检查将顺利通过,会执行代码:
if (formIsValid){
	$("#user").get(0).submit();
	return;
}
此时表单确实会提交,但是由于调用submit()时触发了表单的validationEngine检查功能(监听了onsubmit事件),会造成循环提交。在其他浏览器中未发现重复提交的问题,但是在IE下此问题一直存在,版本包括IE 6 7 8,我所使用的validationEngine版本为2.6.1

研究了一晚上,最后找到了解决办法。
将表单中的<input type="submit">改成<input type="button">即把按钮类型从“提交”改为“普通按钮”,并加入onclick事件:
<input type="button" value="提交" οnclick="doSubmit()" />

加入doSubmit()方法:
<script type="text/javascript">
	function doSubmit(){
		if ($("#user").validationEngine("validate")){
			$("#user").get(0).submit();
		}
	};
</script>

然后将原来脚本中的判定提交代码删除:
if (formIsValid){
$("#user").get(0).submit();
return;
}

此时再点击提交就不会出现提交两次的问题了。

发布了68 篇原创文章 · 获赞 252 · 访问量 147万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章