请教一个jQuery的问题
来源:5-10 首页.UI组件-UiCascading(下)
weixin_慕的地5241954
2019-10-10 00:58:33
$.fn.UiCascading = function(){
var ui = $(this);
var selects = $('select',ui);
selects
.on('change',function(){
var val = $(this).val();
// console.log(val) 获取当前selects的值,如朝阳区,下面是当前selects的索引
var index = selects.index(this);
// 根据当前的值,触发下一个 select 的更新
var where = $(this).attr('data-where');
where = where ? where.split(',') : [];
where.push( val );
// 下面是当前select选中后,后面一项数据的更新
selects.eq(index+1)
.attr('data-where',where.join(',')) // join把数组转成字符串
.triggerHandler('reloadOptions');
// 触发下一个之后的所有select的初始化(清除不应该的数据项)
// ui.find()方法这里的语法是先找出当前的select,然后把后面所有的select找出来并选中,然后把所有选中的select的'data-where'属性清空,再执行'reloadOptions'更新数据方法,因为find方法找到的是数组,所以要用each方法遍历每一项清除
ui.find('select:gt('+ (index+1) +')').each(function(){
$(this)
.attr('data-where','')
.triggerHandler('reloadOptions');
})
})
.on('reloadOptions',function(){
// reloadOptions方法是触发下一个之后的 select 的初始化(清除不应该的数据项)
var method = $(this).attr('data-search');
//method知道当前的接口是哪个
var args = $(this).attr('data-where').split(',');
// 这里是把当前'data-where'的数据用split方法拆成数组
var data = AjaxRemoteGetData[ method ].apply( this, args );
// 向data.js中的AjaxRemoteGetData对象通过method接口拿数据,然后用apply方法向当前对象传args数组,配合split方法使用
var select = $(this);
// 把select自己拿到
select.find('option').remove();
// 把当前的select中的所有option项清除
// 下面是遍历数据data,然后为清空的select添加数据
$.each( data , function(i,item){
// debugger 获取当前函数传入的参数,配合arguments使用
var el = $('<option value="'+item+'">'+item+'</option>');
select.append(el);
// 添加数据
});
});
// 默认第一个元素执行更新
selects.eq(0).triggerHandler('reloadOptions');
}1、看看我理解的对不对?
2、根据当前的值,触发下一个 select 的更新,怎么触发更新的,能结合代码详细说一下吗?对
where和selects.eq(index+1)这两个地方不理解
var val = $(this).val();
// console.log(val) 获取当前selects的值,如朝阳区,下面是当前selects的索引
var index = selects.index(this);
// 根据当前的值,触发下一个 select 的更新
var where = $(this).attr('data-where');
where = where ? where.split(',') : [];
where.push( val );
// 下面是当前select选中后,后面一项数据的更新
selects.eq(index+1)
.attr('data-where',where.join(',')) // join把数组转成字符串
.triggerHandler('reloadOptions');
2回答
你好,
1、gt(index+1)是不包括索引1的,因为gt方法匹配所有大于给定索引值的元素。并且前面索引1已经重新加载过了:
2、老师在代码中给你添加下注释,可以参考一下哦:
// ui-cascading
$.fn.UiCascading = function() {
var ui = $(this);
var selects = $('select', ui);
selects
.on('change', function() {
var val = $(this).val();
var index = selects.index(this);
// 触发下一个 select 的更新,根据当前的值
// 获取当前select的data-where属性值,开始值为空字符串
var where = $(this).attr('data-where');
// 三目运算符判断where是否有值,如果有,将字符串分割成数组,如果没有为空数组
where = where ? where.split(',') : [];
// 将当前选择的select项放进数组中
where.push($(this).val());
// 选择下一个select,
selects.eq(index + 1)
//设置data-where属性值为where值(数组拼接成字符串).例如第一个select选择的是朝阳区,那么这里data-where属性值就是朝阳区
.attr('data-where', where.join(','))
//调用reloadOptions事件
.triggerHandler('reloadOptions');
// 触发下一个之后的 select 的初始化(清除不应该的数据项)
ui.find('select:gt(' + (index + 1) + ')').each(function() {
// 将下一个之后的所有select的data-where属性值清空
$(this)
.attr('data-where', '')
// 调用reloadOptions事件
.triggerHandler('reloadOptions');
})
})
.on('reloadOptions', function() {
// 获取当前select的data-search属性值
var method = $(this).attr('data-search');
// 获取当前select的data-where属性值,并分割成数组
var args = $(this).attr('data-where').split(',');
// 通过获取到的data-search属性值以及data-where属性值(筛选条件,例如朝阳区),从data.js中获取相应的数据
var data = AjaxRemoteGetData[method].apply(this, args);
var select = $(this);
// 将原来的option选项移除
select.find('option').remove();
// 将数据进行遍历,将每一项数据进行标签拼接,添加到select中
$.each(data, function(i, item) {
var el = $('<option value="' + item + '">' + item + '</option>');
select.append(el);
});
});
selects.eq(0).triggerHandler('reloadOptions');
}祝学习愉快!
好帮手慕星星
2019-10-10
同学你好,
1、find处解释有点小问题:

是当前的下一个select后面所有的清空,因为index+1了哦。
2、可以参考下面链接:
https://class.imooc.com/course/qadetail/151637
里面有详细的解释。
如果还有疑问,可以继续提问哦!
祝学习愉快!欢迎采纳~
相似问题