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

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

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

多选:呈现列表

具体代码如下所示:

/**
 *下拉框插件-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下拉选择框插件支持单选多选功能代码的相关内容,希望对大家有所帮助!

(0)

相关推荐

  • JS实现单击输入框弹出选择框效果完整实例

    本文实例讲述了JS实现单击输入框弹出选择框效果的方法.分享给大家供大家参考,具体如下: 运行效果截图如下: 完整实例代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999

  • js表单中选择框值的获取及表单的序列化

    本文特意为js表单中选择框值的获取及表单的序列化做了下总结,写成了一个对象,分享给大家,欢迎大家学习. var formUtil = { // 获取单选按钮的值,如有没有选的话返回null // elements为radio类的集合的引用 getRadioValue:function(elements) { var value = null; // null表示没有选中项 // 非IE浏览器 if(elements.value != undefined && elements.value

  • AngularJS入门教程之Select(选择框)详解

    AngularJS Select(选择框) AngularJS 可以使用数组或对象创建一个下拉列表选项. 使用 ng-options 创建选择框 在 AngularJS 中我们可以使用 ng-option 指令来创建一个下拉列表,列表项通过对象和数组循环输出,如下实例: 实例 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script src="http://a

  • js表单处理中单选、多选、选择框值的获取及表单的序列化

    本文总结了下在表单处理中单选.多选.选择框值的获取及表单的序列化,写成了一个对象.如下: var formUtil = { // 获取单选按钮的值,如有没有选的话返回null // elements为radio类的集合的引用 getRadioValue:function(elements) { var value = null; // null表示没有选中项 // 非IE浏览器 if(elements.value != undefined && elements.value != '')

  • JS实现漂亮的时间选择框效果

    本文实例讲述了JS实现漂亮的时间选择框效果.分享给大家供大家参考,具体如下: HTML代码部分: <html> <script language=javascript src="dataone.js"></script> <table align="center"> <tr> <td> <body> (1)只选择日期 <input type="text" n

  • JS点击某个图标或按钮弹出文件选择框的实现代码

    下面一段代码是基于js实现的点击某个图标或按钮弹出文件选择框的核心代码,代码比较简单,需要的朋友参考下 具体代码如下所示: <HTML> <head> <script type="text/javascript" src="script/jquery-1.6.2.min.js"></script> <script type='text/javascript'> function selectFile(){

  • js实现上传文件添加和删除文件选择框

    本文这里给大家说个用javascript实现的很实用的功能,是在上传附件的时候,可以动态地添加和删除文件选择框,然后一次性上传. 从理论上看,实现起来比较容易,但实际工作的时候还是遇到两个难点,这些难点归结起来都是一个原因造成的,那就是浏览器的兼容性.在脚本中要用到两个函数:insertAdjacentHTML和removeChild,而恰好这两个函数在Firefox下都不能正常使用.几乎花费了一天的时候,在网上搜索着解决的方法,还好被找到了,也让我大松一口气. 具体两个函数是这样的: <scr

  • 详解iOS时间选择框

    本文实例为大家介绍了iOS时间选择框的示例代码,供大家参考,具体内容如下 代码: 一.头文件 #import <UIKit/UIKit.h> @class ITTPickView; @protocol ITTPickViewDelegate <NSObject> @optional -(void)toobarDonBtnHaveClick:(ITTPickView *)pickView resultString:(NSString *)resultString; @end @int

  • 深入理解选择框脚本[推荐]

    前面的话 选择框是通过<select>和<option>元素创建的,又称为下拉列表框.为了方便与这个控件交互,除了所有表单字段共有的属性和方法外,javascript还提供了一些属性和方法.本文将详细介绍选择框脚本 <select> 首先介绍关于<select>元素的相关属性 multiple multiple属性表示是否允许多项选择 <select name="test" id="test"> <o

  • javascript实现下拉提示选择框

    本文介绍了select和sugget结合起来使用的例子,支持下拉的直接选择,也支持在下拉内容中输入过滤. 整体效果就是下面这样的:   1.首先需要引入如下文件 <link href="select2.min.css" rel="stylesheet" /> <script type="text/javascript" src="jquery-2.1.4.min.js"></script>

  • js下拉选择框与输入框联动实现添加选中值到输入框的方法

    本文实例讲述了js下拉选择框与输入框联动实现添加选中值到输入框的方法.分享给大家供大家参考.具体如下: 这里演示js下拉选择框与输入框联动,直接添加选中值到输入框中的效果.这种效果相信不少朋友见到过吧,省去用户输入的麻烦,这里使用JS直接将值赋予输入框,了解原理之后,可灵活运用,扩展出更多的特效来. 运行截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-select-value-to-input-codes/ 具体代码如下: <html> <

  • jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法

    本文实例讲述了jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法.分享给大家供大家参考,具体如下: 一.先描述下可以实现什么: 下拉框一改变,弹出框出现,选择弹出框中的值会赋值给下拉菜单 二.代码: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Subscribe策略</ti

随机推荐