表单取消监听数据变化

表单点击取消做数据判断

最近开发遇到一个问题,就是在创建一个表单,有提交和取消两个按钮,点击提交自然跳转到对应的页面,点击取消则需要根据用户是否对表单做了修改进而做相关交互。如果用户对表单做了填写,点击取消,那么将会提示他确定取消保存,确定后回退到上一个页面。如果没有对表单有改变,则直接回退到上一个页面。
需求就是这么简单,折磨了我半天啊。
起初我的第一反应就是,找jQuery的相关方法,看看有没有能直接绑定的,然而并没有。然后在各种前端群问了一番,有的说用onchange也有一些其他的,印象不深了。然后试过之后发现onchange是不能在点击取消的时候直接反馈bool值的。各种尝试后都没有用,整个人疯了。
其实问题本来很简单,就是点击取消,对比两次数据是否改变,然后做相关的操作。但是总觉得用源生写太麻烦了,就没去想,最后我还是决定用源生来实现。

form表单代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<form action="personalInfo.html">
<div class="am-u-sm-12 am-u-md-12">
<ul class="am-u-sm-12 am-u-md-6">
<li>
<small>部门:</small><select >
<option value="option1">学院办公室</option>
<option value="option2">党委办公室</option>
<option value="option3">学生工作办公室(院团委)</option>
<option value="option4">合作事务办公室</option>
<option value="option5">留学生管理办公室</option>
<option value="option6">基础语言教研室</option>
</select>
</li>
<li>
<small>岗位:</small><input type="text" value="岗位" />
</li>
<li>
<small>职务:</small><select>
<option value="option1">院长</option>
<option value="option2">副院长</option>
<option value="option3">主任</option>
<option value="option4">副主任</option>
<option value="option5">教师</option>
<option value="option6">职员</option>
<option value="option7">其他</option>
</select>
</li>
<li>
<small>职称:</small><input type="text" value="职称">
</li>
<li>
<small>性别:</small><select >
<option value="option1">男</option>
<option value="option2">女</option>
</select>
</li>
<li>
<small>出生日期:</small><label>
<input type="text" placeholder="请选择" value="2017-01-01">
</label>
</li>
<li><small>身份证号:</small><input type="text" value="420621112"></li>
<li><small>备注:</small><textarea></textarea></li>
</ul>
</div>
<div class="am-u-sm-12 am-u-md-12">
<div class="saveBox am-center">
<button type="submit" class="t-save">保&nbsp;&nbsp;存</button>
<button type="button" class="t-cancel">取&nbsp;&nbsp;消</button>
</div>
</div>
</form>

以上拿来了一些简单的表单列表,做相关的测试吧。
表单里面type的类型有:text select textarea。

说说思路

获取到表单初始的数据
点击取消,再次获取数据
判断两次数据是否有变化
有变化—> 弹出提示; 没有数据—>直接回退上个页面

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
var beforeData = []; //定义一个变量,来接收刚开始的数据
var afterData = []; //定义一个变量,来接收后来的数据
var isModified=false; //定义一个变量,存储数据是否改变(开关)
// 获取初始数据开始
for (var i=0;i<$("input").length;i++){
beforeData.push($("input").eq(i).val())
}
for (var i=0;i<$("select").length;i++){
beforeData.push($("select").eq(i).val())
}
for (var i=0;i<$("textarea").length;i++){
beforeData.push($("textarea").eq(i).val())
}
// 获取初始数据结束
// 当用户点击了取消button
$('.t-cancel').click(function (){
// 获取变化后的数据开始
for (var i=0;i<$("input").length;i++){
afterData.push($("input").eq(i).val())
}
for (var i=0;i<$("select").length;i++){
afterData.push($("select").eq(i).val())
}
for (var i=0;i<$("textarea").length;i++){
afterData.push($("textarea").eq(i).val())
}
// 获取变化后的数据结束
// 这里开始比较两次数据变化
for (var i=0;i<afterData.length;i++){
if (afterData[i] != beforeData[i]) {
// 当有一个数据和之前数据用所不同的时候,就设置isModified为false,并且就可以退出程序了(节约内存开销)
isModified = true;
break;
}
}
// 在这来判断,根据isModified来做相关的处理
if(isModified){
var isLeave = window.confirm("数据已经修改,确定要离开?");
if (isLeave) {
history.back();
}
}else{
history.back();
}
})

以上就是整个的代码实现

文章目录