异步提交表单的问题:
异步提交表单时,如果点击了type=submit的Button或input后,form是会二次提交的,第一次是异步提交的,第二次表单自身仍会提交,这就造成了异步提交操作异常。
想要解决二次提交问题,那就要把Button和input的type换成button,给他添加click事件,然后异步提交到服务器,由于没有触发表单的submit事件所以解决了表单的二次提交问题,
但是这会产生另一个问题——由于没有触发submit事件,所以表单验证不会触发,这就需要我们手动进行表单验证,否则数据不经验证就提交到服务器会产生异常。
异步提交表单最好的方式是使用JQuery.form.js插件,它会替换掉默认的submit事件,当点击submit按钮后表单会触发验证,但是不会二次提交。
$().ajaxForm()和
$().ajaxSubmit()的区别:
- ajaxForm使用的时候必须要有submit按钮;而ajaxSubmit则可以是任何元素的click事件。
- 要想触发表单的验证事件则必须要触发submit事件,使用ajaxSubmit是不会触发表单的验证事件的,所以最好使用ajaxForm。
- 但是必须清楚ajaxForm依赖于表单的[type=submit],如果没有触发submit事件,ajaxForm是没有任何效果的。
- 异步提交时,如果不想点击submit按钮,但是又为了实现表单的验证,那么可以使用一个div将submit按钮包裹起来,然后设置div的display为none,之后在submit按钮的click事件中定义异步提交的方法,之后在想异步提交的时候调用submit按钮的click()方法。这样表单会触发验证,同时ajaxForm会阻止表单的自动提交,转而进行异步提交。如此一来,表单验证和异步提交的问题就完美解决了。
$().resetForm() : 重置表单
$().clearForm() : 清空表单
JQuery.form.js
//异步提交参数信息
var options={
target : '#output',
//
把服务器返回的内容放入id为output的元素中
beforeSubmit : showRequest,
//
提交前的回调函数
success : showResponse,
//
提交后的回调函数
//
url : url, //默认是form的action,如果申明,则会覆盖
//
type : type, // 默认值是form的method("GET" or "POST"),如果声明,则会覆盖
//
dataType : null, // html(默认)、xml、script、json接受服务器端返回的类型
//
clearForm : true, // 成功提交后,清除所有表单元素的值
//
resetForm : true, // 成功提交后,重置所有表单元素的值
timeout : 3000
//
限制请求的时间,当请求大于3秒后,跳出请求
}
function
showRequest(formData, jqForm, options){
//
formData: 数组对象,提交表单时,form插件会以ajax方式自动提交这些数据,格式如[{name:user,value:val},{name:pwd,value:pwd}]
//
jqForm: jQuery对象,封装了表单的元素
//
options: options对象
var queryString=$.param(formData);
//
name=1&address=2
var formElement=jqForm[0];
//
将jqForm转换为DOM对象
var address=formElement.address.value;
//
访问jqForm的DOM元素
return
true;
//
只要不返回false,表单都会提交,在这里可以对表单元素进行验证
}
function
showResponse(responseText,statusText){
//
dataType=xml
var name=$("name",responseXML).text();
var address=$("address",responseXML).text();
$("#xmlout").html(name+" "+address);
//
dataType=json
$("#jsonout").html(data.name+" "+data.address);
}
示例:
<form id="form1" name="form1">
<input id=
"userName"
name=
"userName"
value=
"姓名"
/>
<input id=
"age"
name=
"age"
value=
"30"
/>
<input type=
"submit"
value=
"submit"
/>
</form>
<input id=
"myButton"
type=
"button"
value=
"提交"
/>
<script type=
"text/javascript"
>
var
myData = {
"CnName"
:
"GQL"
,
"EnName"
:
"Coker"
};
$(
function
() {
var
ajaxFormOption = {
type:
"post"
,
//提交方式
dataType:
"json"
,
//数据类型
data: myData,
//自定义数据参数,视情况添加
url:
"TestHandler.ashx?type=ajaxForm"
,
//请求url
success:
function
(data) {
//提交成功的回调函数
document.write(
"success"
);
}
};
//form中有submit按钮——方式1
$(
"#form1"
).ajaxForm(ajaxFormOption);
//form中有submit按钮——方式2
$(
"#form1"
).submit(
function
() {
$(
this
).ajaxSubmit(ajaxFormOption);
return
false
;
});
//不需要submit按钮,可以是任何元素的click事件
$(
"#myButton"
).click(
function
() {
$(
"#form1"
).ajaxSubmit(ajaxFormOption);
return
false
;
});
});
</script>
示例2:
//需要提交的表单
<
form
id
="AddRiskForm"
class
="layui-form layui-form-pane">
<
div
class
="layui-form-item">
<
label
class
="layui-form-label">
风险等级
</
label
>
<
div
class
="layui-input-block">
<
input
type
="number"
name
="Level"
lay-verify
="required|number"
autocomplete
="off"
class
="layui-input">
</
div
>
</
div
>
<
div
class
="layui-form-item">
<
label
class
="layui-form-label">
风险描述
</
label
>
<
div
class
="layui-input-block">
<
input
type
="text"
name
="Description"
lay-verify
="required"
autocomplete
="off"
class
="layui-input">
</
div
>
</
div
>
<
div
class
="layui-form-item">
<
label
class
="layui-form-label">
颜色码
</
label
>
<
div
class
="layui-input-block">
<
input
type
="color"
name
="Color"
lay-verify
="required"
autocomplete
="off"
class
="layui-input">
</
div
>
</
div
>
<
div
class
="layui-form-item"
style
="
display
:none">
<
label
class
="layui-form-label">
提交
</
label
>
<
div
class
="layui-input-block">
<
button
class
="layui-btn layui-btn-primary"
lay-submit
id
="sub_riskadd"></
button
>
</
div
>
</
div
>
</form>
//表单submit按钮点击事件
$(
"#sub_riskadd"
).click(
function
() {
var
options = {
url:
"../Handlers/AddRiskSettingHandler.ashx"
,
type:
'post'
,
success:
function
(_res) {
if
(_res ==
'ok'
) {
layer.closeAll();
layer.msg("添加成功");
$("#AddRiskForm").resetForm();
}
else
{
layer.msg("操作失败,请检查输入的参数信息");
}
riskSettingTableIns.reload();
}
};
$("#AddRiskForm").ajaxForm(options);
});
//在需要异步提交的时候,调用submit按钮的click()事件
function
OpenRiskAdd() {
layer.open({
type: 1,
title:
'添加Risk设置'
,
area: [
'400px'
,
'500px'
],
content: $('#addRisk'),
btn: [
'确定'
,
'取消'
],
yes:
function
() {
$("#sub_riskadd").click();
},
btn2:
function
() {
layer.close();
}
});
}