/** * 加载数据插件 * 不支持链式调用 * 本插件支持筛选,排序,及关键字搜索功能 * 筛选框容器id 需设置为 list_param 筛选类目需设置class='filter' 每个选项需设置 class='filter_item' * 排序框容器id 需设置为 sort_param 排序选项需设置class='sort_item' 升序class='sort_item asc' 降序class='sort_item desc' * 本插件可以与其他分页插件结合使用: * 定义插件后在分页的回调中设置页码参数后调用loadpage方法即可 示例如下 * window.loader = $.dataloader(options) * window.loader.options = $.extend(window.loader.options, * { * pagesize : '${pagesize}', * pageno: obj.curr * }); * window.loader.loadpage(); * * created by u on 2018/4/19. */ ;(function($,window,document,undefinded){ /** * 构造函数 * @param ele jquery对象 * @param opt 自定义设置 * opt 默认值 * { * 'url': '#', 请求数据地址 'sync': true, 是否异步调用 false表示同步 'type': 'json', 返回的数据类型 'selclsname':'current', 选中项类名 'pageevent': '', 订制化页面点击事件 'callback' : null, 回调函数 'params' : {}, 请求入参 'pagesize': 10, 分页量 'pageno': 1, 页码 'moreheight':30 更多按钮展开高度 'defaultsel': 默认选中参数 * } */ var dataloader = function(ele,opt){ this.$element = ele, this.defaults = { 'url': '#', 'sync': true, 'type': 'json', 'selclsname':'current', 'pageevent': '', 'getparam':'', 'callback' : '', 'params' : {}, 'pagesize':10, 'pageno':1, 'moreheight':30, 'defaultsel': {} }, this.options = $.extend({}, this.defaults, opt); this.options.params.pagesize = this.options.pagesize; this.options.params.pageno = this.options.pageno; }; //定义对象方法 dataloader.prototype = { //加载数据页面 loadpage: function() { var that = this; //分页参数合并 that.options.params.pagesize = that.options.pagesize; that.options.params.pageno = that.options.pageno; base.tip.showloading($(document.body), true, "加载中..."); base.ajax.load(that.options.url,that.options.params, function(){ base.tip.showloading($(document.body), false, "加载中..."); if (that.options.callback){ that.options.callback.call(that); } },that.$element); return that.$element; }, //获取参数 getparam : function(selclsname){ var param = {}; $('#list_param').find('.filter').each(function(i,e){ var name = $(e).attr('id'); if (typeof name === 'undefined'){ //未找到名称 跳出当前循环 return true; } var value = ''; if( name === 'search'){ $(e).find('input[type=text]').each(function(){ name = $(this).attr('name'); value = $(this).val() ; value = typeof value === 'undefined' ? '' : value; param[name] = value; }); }else{ var length = $(e).find('.'+selclsname).length; value = $(e).find('.'+selclsname).eq(length - 1).data('value'); value = typeof value === 'undefined' ? '' : value; param[name] = value; } }); param['sorttag'] = $('#sort_param').find('.'+selclsname).data('value'); this.options.params = $.extend({}, this.defaults.params,this.options.params, param); return this.$element; }, //设置页面事件 setevent:function(selclsname){ //筛选点击事件(包含搜索) var obj = this; $('#list_param').find('.filter').each(function(i,ele){ var id = $(ele).attr('id'); $(ele).on('click','.filter_item',function(ce){ var $that = $(ce.currenttarget); if(id !== 'search' && $that.data('current') !== 'no'){ $that.parents('#'+id).find('.filter_item').removeclass(selclsname); $that.addclass(selclsname); } if ( $that.data('current') !== 'no'){ obj.getparam(selclsname); obj.options.pageno = 1; obj.loadpage(); } }); }); //排序点击事件 $('#sort_param').on('click','.sort_item',function(ce){ var $that = $(ce.currenttarget); //已选中升序点击改为倒序 if($that.hasclass('asc') && $that.hasclass(selclsname) ){ var desc = $that.data('desc'); $that.data('value',desc); $that.removeclass('asc').addclass('desc'); $that.find('.order').text('↓'); }else if($that.hasclass('desc') && $that.hasclass(selclsname)){ //已选中降序点击改为升序 var asc = $that.data('asc'); $that.data('value',asc); $that.removeclass('desc').addclass('asc'); $that.find('.order').text('↑'); } $that.siblings().removeclass(selclsname); $that.addclass(selclsname); obj.getparam(selclsname); obj.options.pageno = 1; obj.loadpage(); }); //更多展开 $(".btn_more").click(function(){ if($(this).hasclass('btn_more_on')){ $(this).removeclass('btn_more_on'); $(this).addclass('btn_more_off'); $(this).parent().prev('.list_prop_left').removeclass('list_prop_left_more'); $(this).find('span').text("展开") }else if($(this).hasclass('btn_more_off')){ $(this).removeclass('btn_more_off'); $(this).addclass('btn_more_on'); $(this).parent().prev('.list_prop_left').addclass('list_prop_left_more'); $(this).find('span').text("收起") } }); //$(".list_prop_left_more").each(function(){ // var height = $(this).height(); // if(height > obj.options.moreheight){ // $(this).parent().find('.btn_more').trigger("click"); // } //}); }, setdefaultsel:function(){ var defaultsel = this.options.defaultsel; if(!$.isemptyobject(defaultsel)){ for (var key in defaultsel){ var value = defaultsel[key]; $('#' + key).find('.filter_item').each(function() { if ($(this).data('value') == value) { $(this).siblings().removeclass('current'); $(this).addclass('current'); return false; } }); } }else{ $('.filter').each(function(){ var paramname = $(this).attr('id'); var paramval = decodeuri(utils.getrequestparam(paramname)); $(this).find('.filter_item').each(function(){ if($(this).data('value') == paramval){ $(this).siblings().removeclass('current'); $(this).addclass('current'); return false; } }); }) } } }; //在插件中使用dataloader对象 $.fn.dataloader = function(options) { //创建loadpage的实体 var loader = new dataloader(this, options); //自定义参数获取方法 if (typeof loader.options.getparam === 'function'){ loader.getparam = loader.options.getparam; } loader.setevent(loader.options.selclsname); loader.setdefaultsel(); loader.getparam(loader.options.selclsname); //自定义事件 if (typeof loader.options.pageevent === 'function'){ loader.options.pageevent(loader); } loader.loadpage(); return loader; } })(jquery, window, document);