基于jQuery下拉选择框插件支持单选多选功能代码


Posted in Javascript onJune 07, 2016

由于最近项目的需求,需要做一个下拉选择框的插件,支持单选显示表单数据,多选显示表格数据,该插件主要运用了jQuery与jqgrid以及easyui。

下面给大家展示下效果图,如果大家感觉还不错,请参考实现代码:

基于jQuery下拉选择框插件支持单选多选功能代码

基于jQuery下拉选择框插件支持单选多选功能代码

多选:呈现列表

基于jQuery下拉选择框插件支持单选多选功能代码

基于jQuery下拉选择框插件支持单选多选功能代码

具体代码如下所示:

/** 
 *下拉框插件-chooseList 
 *调用插件的方式以及格式: 
 * 1.首先你需要创建一个div面板,给div定义ID 
 * 2.在你所需要的地方调用插件: 
 * 参数说明: 
 * $("#divID").chooseList({ 
 * query_url :加载下拉框数据的URL,指定你所写编写的controller地址,如果URL为空则使用插件提供的默认URL 
 * divID:divID 
 * sidx:排序字段,默认罪犯编号 
 * sord:排序类型,默认desc 
 * postData: postData: {filters:JSON.stringify(filters)} 自定义查询条件 
 * filters的格式如下 
 *  var rules = []; 
   rules.push({"field":"gydwName","op":"cn","data":"xxxx"}); 
   var filters = {"groupOp":"AND","rules":rules}; 
   isMultiselect:是否多选,默认单选false 
 *   
 *  }) 
 * 
 * 
 */ 
(function ($) { 
  $.fn.extend({ 
    chooseList: function (options) { 
      //产生随机数 
      var random =Math.floor(Math.random()*100000+1); 
      /** 
      * 自定义参数,需要使用其中的属性直接:customparams.属性名 
      */ 
      var customparams = { 
        resultObj : {},//存储单选选择的后的数据,返回给外界调用者使用 
        resultListObj : new map(),//存储多选选择的后的数据,返回给外界调用者使用 
        currentTag : this,//当前标签对象 
        formID: "form_"+random, 
        chooseID : "sel"+"_"+random,//下拉选择框的ID 
        gridID :"grid"+"_"+random,//dataGrid的ID 
        pager : "pager"+"_"+random,//分页ID 
        countRow :0//计数行号,默认为0 
      }; 
      /** 
      * 参数和默认值 
      */ 
      var defaults = { 
        _search:"false", 
        //如果未传入url,则使用默认的url进行查询 
        query_url :contextPath + "/chooseCriminal", 
        sidx:"bh",//排序字段,默认根据罪犯的编号bh 
        sord: "desc",//排序类型:升序,降序 ,默认降序 
        isMultiselect:false,//是否多选,默认单选 
      }; 
      /** 
      * 装载默然参数和传人的参数对象 
      */ 
      var options = $.extend(defaults, options);  
      /** 
      * 解析载入参数 
      * @param query_url 请求的地址 
      * @param flag 标识是第一次加载表格还是模糊查询加载表格数据 
      */ 
      var bindParams = function(query_url){ 
        var params="";//存储解析的参数 
        for(var attr in options){ 
          var key = attr; 
          var value = options[attr]; 
          if(value != "" && !(value instanceof Object)&key!="query_url"&&key!="divID"&&key!=false){ 
            params+=key+"="+value+"&" 
          }else if(value instanceof Object){ 
            params+=$.param(value)+"&"  
          }else if(key=="_search"&&value==false){ 
            params+=key+"=false&"; 
          } 
        } 
        var finalParams =query_url+"?"+params.substring(0,params.length-1); 
        return finalParams; 
       }; 
     /** 
      * 绑定选择罪犯combogrid 
      */ 
     var renderComboGrid = function(){ 
          $("#"+customparams.chooseID).combogrid({ 
          panelWidth: 500, 
          idField: 'bh',//id 
          textField: 'xm',//input显示值 
          pagination : true,//是否分页  
          pageSize: 10,//每页显示的记录条数,默认为10   
          rownumbers:true,//序号 
          url: bindParams(options.query_url), 
          method: 'get', 
          fitColumns: true, 
          columns: [[ 
            {field:'xm',title:'姓名',width:80}, 
            {field:'bh',title:'编号',width:120}, 
            {field:'gydwName',title:'单位',width:80}, 
          ]], 
          keyHandler:{ 
             query:function(keyword){//动态搜索 
               var value =keyword; 
               //装载动态输入参数 
               if(options.postData!=null&&options.postData!=undefined){ 
                 var oldRules = JSON.parse(options.postData.filters); 
                 var newRules =[ 
                        {"field":"xm","op":"cn","data":value}, 
                          (oldRules.rules)[0] 
                        ]; 
                  var filters = {"groupOp":"AND","rules":newRules}; 
                  options = $.extend(defaults, {postData: {filters:JSON.stringify(filters)}});  
               }else{ 
                  var newRules =[ 
                       {"field":"xm","op":"cn","data":value} 
                      ];  
                  var filters = {"groupOp":"AND","rules":newRules}; 
                  options = $.extend(defaults, {queryData: {filters:JSON.stringify(filters)}});  
               } 
               //将输入的值设置至输入框中 
               $("#"+customparams.chooseID).combogrid('setValue', value); 
               //重新请求后台加载表格 
               $("#"+customparams.chooseID).combogrid("grid").datagrid({url:bindParams(options.query_url)}); 
                        } 
                }, 
          onSelect:function(){//选中事件  
                var bh= $("#"+customparams.chooseID).combogrid('grid').datagrid('getSelected').bh;//获取选中行数据的编号   
                //根据罪犯编号获取罪犯的详细信息ajax 
                $.ajax({ 
                  type : 'POST', 
                  url : contextPath + "/chooseList/query", 
                  data :{bh:bh}, 
                  success : function(data) { 
                    //填充表单 
                    PlatformUI.populateForm(customparams.formID, data); 
                    //转换对象中包含时间类型的数值 
                    convertDateObject(data); 
                    //判断当前用户引用的是单选,还是多选 
                    if(options.isMultiselect==false){//单选 
                      $.extend(customparams.resultObj, data); 
                    }else{//多选 
                       addRowData(data); 
                       $.extend(customparams.resultListObj, data);  
                    } 
                    }  
                  }); 
              }  
            }); 
        }; 
     /** 
      * 添加表格的行信息 
      * @param data 数据集 
      */ 
     var addRowData = function(data){ 
        //判断当前对象是否已经存在resultesObj中,如果存在则不保存,反之则保存 
        if(!(customparams.resultListObj.containsKey(data.bh))){ 
          customparams.resultListObj.put(data.bh,data); 
          //获取行数据 
          var rowData = {xm:data.xm, bh:data.bh, gydwName:data.gydwName}; 
          customparams.countRow = customparams.countRow+1; 
          //添加行 
           $("#"+customparams.gridID).addRowData(customparams.countRow, rowData); 
           var totalRecord = customparams.resultListObj.size();//总条数 
        }else{ 
          //提示 
          toastr.warning("数据已被选择!"); 
          return; 
        } 
     }; 
     /** 
      * 删除行指定列 
      * @param bh 编号 
      * @param rowId 行ID 
     */ 
     var deleteRow = function(bh,rowId){ 
        //删除集合中的元素 
        customparams.resultListObj.remove(bh);  
        //删除表格中的行 
        $("#"+customparams.gridID).delRowData(rowId); 
        //更改行号 
        customparams.countRow = customparams.countRow - 1;  
             }; 
       /** 
       * 转换对象时间戳类型的为yyyy-mm-dd字符串 
       * @parma data 数据 
       */ 
      var convertDateObject = function(data) { 
         if(data.rjrq!=null&&data.rjrq!=undefined){ 
           $("#rjrq").val(DateToString(new Date(data.rjrq))); 
         } 
         if(data.csrq!=null&&data.csrq!=undefined){ 
            $("#csrq").val(DateToString(new Date(data.csrq)));  
         } 
         if(data.dqxqqr!=null&&data.dqxqqr!=undefined){ 
           $("#dqxqqr").val(DateToString(new Date(data.dqxqqr))); 
         } 
         if(data.dqxqzr!=null&&data.dqxqzr!=undefined){ 
            $("#dqxqzr").val(DateToString(new Date(data.dqxqzr))); 
         } 
      }; 
      /** 
       * 日期类型转换成字符串型格式yyyy-MM-dd 
       * @param DateIn 转换对象 
       *       
       */ 
      var DateToString = function(DateIn) { 
            return DateIn.getFullYear() 
                + '-' 
                + (DateIn.getMonth() + 1 >= 10 ? DateIn 
                    .getMonth() + 1 : '0' 
                    + (DateIn.getMonth() + 1)) 
                + '-' 
                + (DateIn.getDate() >= 10 ? DateIn.getDate() 
                    : '0' + (DateIn.getDate())); 
      }; 
       /** 
       * 自定义map 
       */ 
       function map () { 
        this.elements = new Array(); 
         //得到map的大小 
          this.size = function() { 
            return this.elements.length; 
          } 
         //判断是否为空 
          this.isEmpty = function() { 
            return (this.elements.length < 1); 
          } 
          //清空 
          this.clear = function() { 
            this.elements = new Array(); 
          } 
          //放进map一个对象 
          this.put = function(_key, _value) { 
            this.elements.push( { 
              key : _key, 
              value : _value 
            }); 
          } 
         //根据键去除一个对象 
          this.remove = function(_key) { 
            var bln = false; 
            try { 
              for (i = 0; i < this.elements.length; i++) { 
                if (this.elements[i].key == _key && typeof this.elements[i].key == typeof _key) { 
                  this.elements.splice(i, 1); 
                  return true; 
                } 
              } 
            } catch (e) { 
              bln = false; 
            } 
            return bln; 
          } 
         //根据键得到一个对象 
          this.get = function(_key) { 
            try { 
              for (i = 0; i < this.elements.length; i++) { 
                if (this.elements[i].key == _key && typeof this.elements[i].key == typeof _key) { 
                  return this.elements[i].value; 
                } 
              } 
            } catch (e) { 
              return null; 
            } 
          } 
         //返回指定索引的一个对象 
          this.element = function(_index) { 
            if (_index < 0 || _index >= this.elements.length) { 
              return null; 
            } 
            return this.elements[_index]; 
          } 
         //是否包含键 
          this.containsKey = function(_key) { 
            var bln = false; 
            try { 
              for (i = 0; i < this.elements.length; i++) { 
                if (this.elements[i].key == _key && typeof this.elements[i].key == typeof _key) { 
                  bln = true; 
                } 
              } 
            } catch (e) { 
              bln = false; 
            } 
            return bln; 
          } 
         //是否包含值 
          this.containsValue = function(_value) { 
            var bln = false; 
            try { 
              for (i = 0; i < this.elements.length; i++) { 
                if (this.elements[i].value == _value && typeof this.elements[i].value == typeof _value) { 
                  bln = true; 
                } 
              } 
            } catch (e) { 
              bln = false; 
            } 
            return bln; 
          } 
         //得到所有的值 
          this.values = function() { 
            var arr = new Array(); 
            for (i = 0; i < this.elements.length; i++) { 
              arr.push(this.elements[i].value); 
            } 
            return arr; 
          } 
         //得到所有的键 
          this.keys = function() { 
            var arr = new Array(); 
            for (i = 0; i < this.elements.length; i++) { 
              arr.push(this.elements[i].key); 
            } 
            return arr; 
          } 
      }; 
     /** 
      * 渲染panel视图 
      */ 
      var renderPanelView = function(){ 
       var html = ""; 
      html+="请选择:<input id='"+customparams.chooseID+"' style='width:200px'/>"; 
      html+="<form id='"+customparams.formID+"'>"; 
      html+="<table>"; 
      html+="<tr>"; 
      html+="<th>姓名:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px ' readonly='true' type='text' id='xm' name='xm' /></td>"; 
      html+="<th>编号:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true' type='text' id='bh' name='bh' /></td>"; 
      html+="<th>单位:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true' type='text' id='gydwName' name='gydwName' /></td>"; 
      html+="<th>入监时间:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true' type='text' id='rjrq' name='rjrq' /></td>"; 
      html+="<td rowspan='7' style='text-align: center'><img src='' width='140' height='200' alt='' /></td>"; 
      html+="</tr>"; 
      html+="<tr>"; 
      html+="<th>出生日期:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='csrq' name='csrq' /></td>"; 
      html+="<th>身份证号:</th>" 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='sfzh' name='sfzh' /></td>"; 
      html+="<th>原判刑期:</th>" 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='xq' name='xq' /></td>"; 
      html+="<th>当前刑期:</th>" 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='dqxq' name='dqxq' /></td>"; 
      html+="</tr>"; 
      html+="<tr>"; 
      html+="<th>刑期起日:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='dqxqqr' name='dqxqqr' /></td>"; 
      html+="<th>刑期止日:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='dqxqzr' name='dqxqzr' /></td>"; 
      html+="<th>处遇等级:</th>"; 
      html+=" <td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='cydjname' name='cydjname' /></td>"; 
      html+="<th>分押类型:</th>" 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='fylxName' name='fylxName' /></td>"; 
      html+="</tr>"; 
      html+="<tr>"; 
      html+="<th>余刑:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='yx' name='yx' /></td>"; 
      html+="<th>军警经历</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='jjjlName' name='jjjlName' /></td>"; 
      html+="<th>特管类别:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='tglb' name='tglb' /></td>"; 
      html+=" <th>累惯犯:</th>" 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='lgfEnum' name='lgfEnum' /></td>" 
      html+="</tr>"; 
      html+="<tr>"; 
      html+="<th>是否老犯:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='isSflf' name='isSflf' /></td>"; 
      html+="<th>是否病犯:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='issfbf' name='issfbf' /></td>"; 
      html+="<th>是否残犯:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='issfcf' name='issfcf' /></td>"; 
      html+="<th>是否危险犯:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='issfwxf' name='issfwxf' /></td>"; 
      html+="</tr>"; 
      html+="<tr>"; 
      html+=" <th>职务犯:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='isZwf' name='isZwf' /></td>"; 
      html+="<th>家庭住址:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='familyAddressDetail' name='familyAddressDetail' /></td>"; 
      html+="<th>罪名:</th>"; 
      html+="<td><input  style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px 'readonly='true'type='text' id='accusationId' name='accusationId' /></td>"; 
      html+=" </tr>"; 
      html+=" </table>"; 
      html+="</form>"; 
      $(customparams.currentTag).append(html); 
       renderComboGrid(); 
      }; 
      /*******************渲染dtaGrid部分*********************/ 
      /** 
      * 渲染dataGrid表格 
      */ 
      var renderGrid = function(){ 
        var gridhtml =""; 
        gridhtml+="请选择罪犯:<input id='"+customparams.chooseID+"' style='width:200px'/>"; 
        gridhtml+="<div>"; 
        gridhtml+="<table id='"+customparams.gridID+"'></table> "; 
        gridhtml+="<div id='"+customparams.pager+"'></div>"; 
        gridhtml+="</div>";  
        $(customparams.currentTag).append(gridhtml); 
        renderComboGrid(); 
        initDataGrid(); 
      }; 
      /** 
      * 加载dataGrid表格数据 
      */ 
      var initDataGrid =function (){ 
        $("#"+customparams.gridID).jqGrid({ 
          datatype : 'local', 
          autowidth: true, 
          height:300, 
          colNames: ["姓名", "编号", "单位","操作"], 
          colModel: [ 
            { name: "xm", index:"xm",align:"center",width:50,sortable: true}, 
            { name: "bh", index:"bh", align:"center",width:50, sortable: true}, 
            { name: "gydwName", index:"gydwName", align:"center",width:50,sortable: true}, 
            { name: "customColumn",formatter:function(cellvalue, options, rowObject){ 
              var obj = "{bh:" + "\"" + rowObject.bh + "\"" + ",rowId:" + "\"" + options.rowId + "\"" + "}"; 
              var columnTemplate = "<span class='btn_orange innerDelBtn' name='"+ obj +"' >删除</span>" 
              return columnTemplate;  
            }, align:"center",width:50,search:false,sortable: false} 
               ], 
          sortname: "bh", 
          sortorder: "desc", 
          rownumbers:true,//添加左侧行号 
          viewrecords: true, 
          gridview: true, 
          autoencode: true, 
          caption: "罪犯信息列表", 
          gridComplete: function(){ 
            binCompleteEvent(); 
          } 
        }); 
      }; 
      /** 
      * 给表格绑定加载完的事件 
      */ 
      var binCompleteEvent =function(){ 
       //给操作栏绑定点击事件 
        $(".innerDelBtn").click(function(e){ 
          var obj = eval("(" + $(e.target).attr("name") + ")"); 
          deleteRow(obj.bh, obj.rowId); 
        }); 
         //选中行鼠标变为手型 
         var ids=$("#"+customparams.gridID).jqGrid('getDataIDs'); 
          for(var i = 0; i < ids.length ; i ++){ 
            var id = ids[i]; 
            $("#"+id).attr("style","cursor:pointer"); 
           } 
      } 
      /*******************渲染dtaGrid部分结束*********************/ 
      /** 
      * 根据类型渲染视图 
      */ 
      var renderView = function(){ 
       //根据isMultiselect判断那种渲染视图 
       options.isMultiselect==true?renderGrid():renderPanelView(); 
      }; 
      /*** 
       * 初始化入口 
       */ 
      renderView(); 
     //使用三元表达式判断返回的应是单个对象还是多个对象 
     return options.isMultiselect==false?customparams.resultObj:customparams.resultListObj; 
    } 
    }); 
  })(jQuery);

以上所述是小编给大家介绍的基于jQuery下拉选择框插件支持单选多选功能代码的相关内容,希望对大家有所帮助!

Javascript 相关文章推荐
greybox——不开新窗口看新的网页
Feb 20 Javascript
js 遍历json返回的map内容示例代码
Oct 29 Javascript
JavaScript中实现依赖注入的思路分享
Jan 15 Javascript
js改变Iframe中Src的方法
May 05 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
Oct 24 Javascript
javaScript语法总结
Nov 25 Javascript
Bootstrap免费字体和图标网站(值得收藏)
Mar 16 Javascript
JS监控关闭浏览器操作的实例详解
Sep 12 Javascript
Vue组件化开发思考
Feb 02 Javascript
Express结合Webpack的全栈自动刷新
May 23 Javascript
详解Webpack4多页应用打包方案
Jul 16 Javascript
原生JavaScript实现贪吃蛇游戏
Nov 04 Javascript
jQuery原理系列-css选择器的简单实现
Jun 07 #Javascript
javascript实现抽奖程序的简单实例
Jun 07 #Javascript
浅谈javascript中new操作符的原理
Jun 07 #Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
Jun 07 #Javascript
jQuery原理系列-常用Dom操作详解
Jun 07 #Javascript
浅析BootStrap栅格系统
Jun 07 #Javascript
浅谈jQuery 选择器和dom操作
Jun 07 #Javascript
You might like
php 删除cookie和浏览器重定向
2009/03/16 PHP
修改PHP的memory_limit限制的方法分享
2012/02/21 PHP
深入解析PHP的Yii框架中的event事件机制
2016/03/17 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
20条学习javascript的编程规范的建议
2014/11/28 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
angularjs使用directive实现分页组件的示例
2017/02/07 Javascript
Vue2组件tree实现无限级树形菜单
2017/03/29 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
2018/01/08 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
详解Next.js页面渲染的优化方案
2019/01/27 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
浅谈JavaScript 声明提升
2020/09/14 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
python笔记:mysql、redis操作方法
2017/06/28 Python
python 通过xml获取测试节点和属性的实例
2018/03/31 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
基于Python+Appium实现京东双十一自动领金币功能
2019/10/31 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
Keras中 ImageDataGenerator函数的参数用法
2020/07/03 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
Python Tkinter实例——模拟掷骰子
2020/10/24 Python
大专会计自我鉴定
2014/02/06 职场文书
《从现在开始》教学反思
2014/04/15 职场文书
洗手间标语
2014/06/23 职场文书
高中综合实践活动总结
2014/07/07 职场文书
人力资源管理专业自荐书
2014/07/07 职场文书
初中生散播谣言检讨书
2014/11/17 职场文书
新郎接新娘保证书
2015/05/08 职场文书
摘录式读书笔记
2015/07/01 职场文书
Mysql中存储引擎的区别及比较
2021/06/04 MySQL
Django rest framework如何自定义用户表
2021/06/09 Python
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫