请教一个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回答

好帮手慕星星

2019-10-11

你好,

1、gt(index+1)是不包括索引1的,因为gt方法匹配所有大于给定索引值的元素。并且前面索引1已经重新加载过了:

http://img.mukewang.com/climg/5d9fdee4096b44e506770395.jpg2、老师在代码中给你添加下注释,可以参考一下哦:

// 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');
}

祝学习愉快!

0

好帮手慕星星

2019-10-10

同学你好,

1、find处解释有点小问题:

http://img.mukewang.com/climg/5d9ea3f40985021006950135.jpg

是当前的下一个select后面所有的清空,因为index+1了哦。

2、可以参考下面链接:

https://class.imooc.com/course/qadetail/151637

里面有详细的解释。

如果还有疑问,可以继续提问哦!

祝学习愉快!欢迎采纳~

0
heixin_慕的地5241954
h 1、比如当前是索引为0的select被选中,然后触发onchange事件,下一个索引为1的select后面所有的清空,难道不包括索引1吗? 2、我参考了,还是不明白,你还是结合我提出的这个问题重新说一遍把
h019-10-10
共1条回复

0 学习 · 14456 问题

查看课程