JS可复用的多条件筛选插件

这是最近公司的一个系统需要用到的筛选功能,为了方便日后维护迭代升级,功能的增加,我写了一个插件,支持自定义模块、自定义默认显示几行,超出后出现更多按钮以及是否显示确定按钮, 不管一个页面中有多少个筛选模块,都可复用,只需要后台传给json数据,操作后通过回调函数实时返给后台同样的数据格式,以达到数据、表现、操作的分离。

这个插件使用非常方便,支持自定义模块、自定义默认显示几行,超出后出现更多按钮以及是否显示确定按钮等等功能。

下面直接上代码:

* @Author:虾兵  @Blog:http://ddbing.com/

* @param   options: 前台传过来的参数,格式如:

            {

            title:null,

            pid:‘screen-wrap‘,

            cid:‘platform‘,

            data:null,

            rows: 2,

            ok:true,

            okVal: ‘\u786E\u5B9A‘,

            callback:null

              };。

* @param   title: 筛选模块标题,默认为空。

* @param   pid: 筛选模块的父级id,默认id为 screen-wrap。

* @param   cid: 筛选模块id,以区分多个筛选模块的情况,默认id为 platform,代表平台。

* @param   data: 后台传过来的数据,格式如:

            [

                {"id":"27","name":"6a818a"},

                {"id":"38","name":"6a818b"}

            ];。

* @param   ok: 是否显示确定按钮,默认显示为:true

* @param   okVal: 确定按钮的文字,默认为:确定。

* @param   rows: 默认显示多少行,超出出现 ‘更多‘ 按钮,默认为2行。

* @param   callback: 回调函数,返回选中的数据,格式JSON,撤销全部返回空数组[]。

*/

;(function ($, window, document, undefined) {

    var QueryScreen = function(options){

            this.opts = $.extend({},this.defaults,options);

            this.arrSelect = [];

        };

    QueryScreen.prototype = {

        constructor:QueryScreen,

        init: function(){

            var that = this, opts = that.opts, pid = opts.pid, temp = that.getTemp();

            $(‘#‘+pid).append(temp);

            that.handleRows()

                .handleMore()

                .handleList()

                .selectAll();

        },

        //处理行及是否显示更多按钮

        handleRows: function(){

            var that = this, opts = that.opts, _$cid = $(‘#‘+opts.cid), rows = opts.rows, nums = 6*rows, dataLen = opts.data.length;

            if ( dataLen-nums <= 0 ) {

                _$cid.find(‘.more‘).addClass(‘hide‘);

            }else{

                nums = nums-1;

                _$cid.find(‘.lists li:gt(‘+nums+‘)‘).addClass(‘hide‘);

            };

            return that;

        },

        //处理更多按钮

        handleMore: function(){

            var that = this, opts = that.opts, _$cid = $(‘#‘+opts.cid), rows = opts.rows, nums = 6*rows-1;

            _$cid.find(‘.more‘).children(‘a‘).on(‘click‘function(){

                var t = $(this);

                if(t.hasClass(‘up‘)){

                    t.removeClass(‘up‘);

                    _$cid.find(‘.lists li:gt(‘+nums+‘)‘).slideUp(‘fast‘);

                }else{

                    t.addClass(‘up‘);

                    _$cid.find(‘.lists li‘).slideDown(‘fast‘);

                }

            });

            return that;

        },

        //处理点击选择选项后

        handleList: function(){

            var that = this, opts = that.opts, _$cid = $(‘#‘+opts.cid), _$lists = _$cid.find(‘li a‘), arrSelect = that.arrSelect, dataLen = opts.data.length;

            var Selected = function (id,name){

                this.id = id;

                this.name = name;

            };

            _$lists.on(‘click‘function(){

                var t = $(this), dataId, name, activeLen = _$cid.find(‘.lists‘).find(‘.active‘).length + 1;

                dataId = $.trim(t.attr(‘data-id‘));

                name = $.trim(t.text());

                if(t.hasClass(‘active‘)){

                    $.each(arrSelect, function(key,value){

                        if (value && value.id && value.id == dataId) {

                            arrSelect.splice(key,1);

                        };

                    });

                    t.removeClass(‘active‘);

                    _$cid.find(‘.handler a‘).eq(0).removeClass(‘active‘);

                    that.callback(arrSelect);

                }else{

                    t.addClass(‘active‘);

                    arrSelect.push(new Selected(dataId,name));

                    if (activeLen === dataLen) {

                        _$cid.find(‘.handler a‘).eq(0).trigger(‘click‘);

                    }else{

                        that.callback(arrSelect);

                    };

                };

                

            });

            return that;

        },

        //处理全选、撤销全选

        selectAll: function(){

            var that = this, opts = that.opts, _$cid = $(‘#‘+opts.cid), _$lists = _$cid.find(‘li a‘), _$a = _$cid.find(‘.handler a‘),arrSelect = that.arrSelect;

            _$a.eq(0).on(‘click‘function(){

                var t = $(this);

                t.addClass(‘active‘);

                _$lists.addClass(‘active‘);

                that.callback(-1);

            });

            _$a.eq(1).on(‘click‘,function(){

                _$lists.removeClass(‘active‘);

                arrSelect.length = 0;

                that.callback([]);

                _$lists.removeClass(‘active‘);

                _$a.eq(0).removeClass(‘active‘);

            });

            return that;

        },

        //选择后的回调数据

        callback: function(data){

            var that = this, opts = that.opts,_data = opts.data,arrSelect=this.arrSelect,json_data = JSON.stringify(this.arrSelect),all_data=JSON.stringify([{‘id‘:‘-1‘,‘name‘:‘全部‘}]);

            if (‘function‘ === typeof opts.callback) {

                if (data === -1) {

                    opts.callback(all_data);

                    arrSelect.length = 0;

                    $.each(_data,function(i,val){

                        arrSelect.push({‘id‘:val.id,‘name‘:val.name});

                    });

                }else{

                    opts.callback(json_data);

                }

            };

            return that;

        },

        //处理模板

        getTemp: function(){

            var that = this, temp = ‘‘, dataTemp = that.dataTemp(), opts = that.opts, okTemp = that.okTemp(), title = opts.title;

            temp += ‘‘

                        +‘‘+ title +‘全选撤销全部‘

                        +‘‘

                            +‘‘

                                +‘‘+ dataTemp +‘‘

                            +‘‘

                            +‘‘

                                +‘更多‘

                            +‘‘

                        +‘‘

                        + okTemp

                    +‘‘;

            return temp;

        },

        //处理数据模板

        dataTemp: function(){

            var temp = ‘‘, opts = this.opts, data = opts.data;

            $.each(data, function(key,value){

                temp += ‘‘+ value.name +‘‘;

            });

            return temp;

        },

        //处理是否显示确定按钮

        okTemp: function(){

            var temp = ‘‘, opts = this.opts, isOk = opts.ok, okVal = opts.okVal;

            if(isOk){

                temp += ‘‘

                            +‘‘+ okVal +‘‘

                        +‘‘;

            };

            return temp;

        },

        //默认参数配置

        defaults: function(){

            var config = {

                title:null,

                pid:‘screen-wrap‘,

                cid:‘platform‘,

                data:null,

                rows: 2,

                ok:true,

                okVal: ‘\u786E\u5B9A‘,

                callback:null

            };

            return config;

        }(),

    };

    window.QueryScreen = QueryScreen;

}(jQuery, window, document));

这个插件你可以用到你网站的任何地方,商业非商业都行,不过恳请仁兄使用时保留备注或者注明代码来源,以对我写代码的鼓励及脑细胞的补偿,也方便日后迭代更新。使用时样式皮肤自行美化。

时间: 2024-08-10 18:53:55

JS可复用的多条件筛选插件的相关文章

第十六篇 基于Bootstarp 仿京东多条件筛选插件的开发(展示上)

这几天学习Bootstrap,本来是两年前的用的东西,现在又重新拾起来,又有很多重新的认识,看了Bootstrap的样式偏多,插件现在还没有学习到几个,也有写几个插件自己用的想法.正好工作上也会用到,现在就写一个京东上筛选商品的插件,不多说上图. 首先看下API 这次只是用来说明下功能 下篇开始说具体的思路,其实也不难自己可以学习下,Demo奉上,但是js代码加密,有想学习都请邮件联系我:[email protected] Demo:http://pan.baidu.com/s/1i3q6oYT

第十七篇 基于Bootstarp 仿京东多条件筛选插件的开发(展示下)

前些时候用换了工作,本来是用的前端框架是easyui,后面用的是bootstrap.对于我来说虽然不是新东西,因为原来毕业时候用过一段时间,也不懂什么插件的开发,现在用过easyui后觉得easyui的用法比较好,容易上手,所有一直有个想法,去开发几个插件自己用用.不多说,上篇文章发面一个多选插件的使用方法,虽然有点不是很完善,但还是可以来用用的.这次就详细说说原理和开发的结节,以及要注意的地方.关于jQuery的插件开发根本也不是什么难的事情,下面就说的我的想法. 开发的原理 jQuery的插

jqgrid 表格中筛选条件的多选下拉,树形下拉 ;文本框清除插件;高级查询多条件动态筛选插件

/** * @@desc 文本框清除按钮,如果isAutoWrap为false当前文本框父级必须是relative定位,boostrap参考input-group * @@author bear.LEE <571115139#qq.com> * @@since 2018-08-21 **/ ; (function ($) { $.fn.extend({ addClearBtn: function (options, $o) { var deft = { symbolClass: "f

关于web多标签多条件筛选的思考

做项目的过程中,发现一次远程链接数据库的耗时大概是300ms~400ms,切身体会到了前辈们经常说的减少链接的重要性,用了缓存后页面的打开时间从1.5s减少到400ms 前提: 那么来说一说正题,web中多标签多条件筛选的设计.有两个思路: 一种是通过页面刷新来获取数据 一种是通过ajax来异步获取数据 思考: 大的方向两条,分支很多,想搜索一下有没有最优方案,似乎找不到. spike: //js来获取用户点击的标签,拼装url,再用window.location.href=url来跳转. a标

juqery学习3之juqery对象条件筛选

代码例子:某个div块下的字体样式的控制. 1 //script代码 2 3 <script src="${sitePath}/cec_wcp/js/jquery-1.8.2.min.js" type="text/javascript"></script> 4 <script type="text/javascript"> 5 6 function SetFont(size){ 7 //如果id为news_co

jquery实现多条件筛选特效代码分享

本文实例讲述了jquery实现多条件筛选特效.分享给大家供大家参考.具体如下:jquery实现的多条件搜索表单带日期选择表格表单效果源码,是一段实现了多个条件筛选搜索的特效代码,多条件拥有时间.地点.酒店位置及酒店名称等选项,同时在时间的输入表格中拥有时间选择功能,是一款非常实用的特效代码,值得大家学习.运行效果图:                        -------------------查看效果 下载源码------------------- Javashop商城系统,专业_省心

织梦CMS实现多条件筛选功能

用织梦实现筛选的功能,其实主要就是运用到了织梦的高级搜索功能,然后用ajax去post替换掉本来的结果就可以了. 其实筛选的话,主要有两个问题需要解决,一个是前台的筛选实现,一个是后台根据前台的点击,反馈出相应的结果. 于是在网上搜索了N多的资料了之后,先实现前台的功能,就是你点了之后会有一个筛选的效果出来,当然,也只是一个效果.具体可以参照:jquery仿京东筛选效果.下面就一步一步用织梦来实现这样的功能. 首先我们先在后台自定义模型(自定义模型都不会的同学,可以直接去面壁思过了) 看到参照网

iOS: 悬浮的条件筛选框使用二

一.介绍: 在前面已经介绍了一种条件悬浮框,使用的是tableView的Plain分组样式实现的,因为这是tableView本身就具备的功能,分组悬浮效果.这次我来介绍第二种更加简单的方法,采用两个ScrollView来实现. 二.实现技术: (1)两个ScrollView,一个是左右滚动,成为内容视图,另一个是上下滚动,作为容器视图: (2) 创建头视图,头视图中有banner图和条件筛选框,标记banner图的高: (3)合理设置上下滚动的容器视图的frame,它承载头视图和内容视图,不过需

Jquery特效之=》仿京东多条件筛选特效

仿京东多条件筛选特效 品牌: 全部 惠普(hp) 联想(Lenovo) 联想(ThinkPad) 宏基(acer) 华硕 戴尔 三星 索尼 东芝 Gateway 微星 海尔 清华同方 富士通 苹果(Apple) 神舟 方正 优雅 价格: 全部 1000-2999 3000-3499 3500-3999 4000-4499 4500-4999 5000-5999 6000-6999 7000-9999 10000以上 尺寸: 全部 8.9英寸及以下 11英寸 12英寸 13英寸 14英寸 15英寸