trigger触发多次的问题,很奇怪,一次比一次多,请大神帮忙看下

牟泽洪 2016-12-08 09:26:31
最近做一个管理系统遇到一个很奇怪的问题,以前都没有遇到过,搜了很多资料也没有找到解决办法。
做的是一个下拉级联请求。大概内容是这样的:先请求二级学院的信息,再根据选中的二级学院选择加载专业,再根据专业加载班级


第一次请求是正常的。
第二次请求二级学院的请求次数不变,但是专业加倍,班级就是四倍。
第三次请求二级学院不变,专业变为第一次的三倍,班级变成6倍。
……



trigger 和triggerHander得到的结果是一样的,还是触发多次。

以下我列出js代码。请大神帮忙看下

//请求二级学院
function ajaxCollegeSelection(selected){
$college.html("");
$.getJSON("college.do?action=list",function(data){
if(data.status==0){
appendSelectItem($college,data);
$college.change(function(e){
ajaxMajorSelection(selected);
ajaxTeacherSelection(selected);
});
if(selected){
$college.val(selected.college);
}
$college.triggerHandler("change");
}
});
}
//请求专业列表
function ajaxMajorSelection(selected){
$major.html("");
$.getJSON("major.do?action=college&college="+$college.val(),function(data){
if(data.status==0){
appendSelectItem($major,data);
$major.change(function(e){
ajaxMyClassSelection(selected);
});
if(selected){
$major.val(selected.major);
}
$major.triggerHandler("change");
}
});
}
//班级请求列表
function ajaxMyClassSelection(selected){
$myClass.html("");
$.getJSON("myclass.do?action=major&major="+$major.val(),function(data){
if(data.status==0){
appendSelectItem($myClass,data);
if(selected){
$myClass.val(selected.myClass);
}
}
});
}
//班级请求列表
function ajaxTeacherSelection(selected){
$teacher.html("");
$.getJSON("teacher.do?action=college&college="+$college.val(),function(data){
if(data.status==0){
appendSelectItem($teacher,data);
if(selected){
$teacher.val(selected.teacher);
}
}
});
}
//将请求到的数据加载到选项
function appendSelectItem(target,data){
if(data.status==0){
var options = "";
$.each(data.content,function(i,item){
options+="<option value=\""+item.id+"\">"+item.name+"</option>";
});
target.html(options);
}
}


...全文
732 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
牟泽洪 2016-12-08
  • 打赏
  • 举报
回复
引用 1 楼 qq_21525397 的回复:
你这个问题。。。。我见过类似的。 问题出在这几句代码上面 1.$college.change 2.$major.change 这里涉及到一个jquery绑定事件方法的原理,从你的用法可以看出你认为jquery绑定事件的方式是用新的方法替换旧的方法,然而事实上是新增的方法和旧的方法会同时存在,在事件触发时也都会执行,所以每次调用这个方法的时候都会多绑定一个事件上去。。。 解决方法就是。。。先取消绑定$college.unbind("change"),然后再调用你的这个绑定方法就Ok了
确实是,感谢大神。更改成以下代码运行正常。主要是对js理解的不够深,还需向各位大师多学习。

function ajaxCollegeSelection(selected){
	$college.html("");
	$.getJSON("college.do?action=list",function(data){
		if(data.status==0){
			appendSelectItem($college,data);
			$college.unbind("change").change(function(e){
				ajaxMajorSelection(selected);
				ajaxTeacherSelection(selected);
			});
			if(selected){
				$college.val(selected.college);
			}
			$college.triggerHandler("change");
		}
	});
}
//请求专业列表
function ajaxMajorSelection(selected){
	$major.html("");
	$.getJSON("major.do?action=college&college="+$college.val(),function(data){
		if(data.status==0){
			appendSelectItem($major,data);
			$major.unbind("change").change(function(e){
				ajaxMyClassSelection(selected);
			});
			if(selected){
				$major.val(selected.major);
			}
			$major.triggerHandler("change");
		}
	});
}
//班级请求列表
function ajaxMyClassSelection(selected){
	$myClass.html("");
	$.getJSON("myclass.do?action=major&major="+$major.val(),function(data){
		if(data.status==0){
			appendSelectItem($myClass,data);
			if(selected){
				$myClass.val(selected.myClass);
			}
		}
	});
}
小生--幻 2016-12-08
  • 打赏
  • 举报
回复
你这个问题。。。。我见过类似的。 问题出在这几句代码上面 1.$college.change 2.$major.change 这里涉及到一个jquery绑定事件方法的原理,从你的用法可以看出你认为jquery绑定事件的方式是用新的方法替换旧的方法,然而事实上是新增的方法和旧的方法会同时存在,在事件触发时也都会执行,所以每次调用这个方法的时候都会多绑定一个事件上去。。。 解决方法就是。。。先取消绑定$college.unbind("change"),然后再调用你的这个绑定方法就Ok了

87,915

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧