zoukankan      html  css  js  c++  java
  • 自动补全下拉框(可输入匹配的下拉框)

    原文:http://davidhhs.iteye.com/blog/2268888

    功能优化,增加级联查询功能(注:依赖Jquery.js,附有源代码,可以当作插件直接使用)

    级联查询下拉框组调用代码:  

    bindCascadeAutoSelect("selectId1", true, function(re1) {

    // re1 一级选项的值

    $("#selectId2).attr("dftCon", re1);

    bindCascadeAutoSelect("selectId2", true, function(re2) {

    // re2 二级选项的值

    $("#selectId3).attr("dftCon", re2);

    bindCascadeAutoSelect("selectId3", true, function(re3) {

    // re3 三级选项的值

    });

    });

    });

    普通查询下拉框调用代码:  

    bindAutoSelect("containerId", true, function() {});

     

    效果如下:

     

    JSP页面代码:

        注意事项:

                   依赖 jquery

                   name="supplierCode" textName="supplierName" , supplierCode会绑定到一个input[hidden] 上对应的是选项的值,supplierName对应的是选项显示的文本。

                   url: 对应的值是下拉列表数据来源。 返回类型是 List<xxDto> xxDto包含code, name 两个属性,具体格式可以根据自己的需求稍作修改

    dftVal: 默认选中项的值

    dftCon: 级联查询时的上级选中的值做为当前下拉框的固定搜索参数,

    Css代码  收藏代码
    1. /***  
    2.  * 自动检索下拉框  
    3.  */  
    4. .autoSelect {  
    5.     background: url("../images/select-icon.png") right no-repeat;  
    6.  }  
    7. input[type=text]::-ms-clear {display:none;}  
    8.   
    9. .autoSelectDiv,.cascadeAutoSelectDiv {  
    10.     #FFFFFF;  
    11.     position: absolute;  
    12.     display: none;  
    13.     max-height: 283px;  
    14.     overflow: auto;  
    15.     border-top: 1px solid #CCCCCC;  
    16.     border-bottom: 1px solid #CCCCCC;  
    17.     z-index: 100;  
    18. }  
    19. .autoSelectDiv ul {  
    20.     list-style:none;  
    21.     padding: 0px;  
    22.     margin-bottom: 0px;  
    23.     max-height: 283px;  
    24. }  
    25. .autoSelectDiv ul li {  
    26.     border:1px solid #CCCCCC;  
    27.     border-top:none;  
    28.     padding:6px;  
    29.     cursor:pointer;  
    30.     height: 28px;  
    31. }  
    32. .autoSelectDiv ul:first-child {  
    33.     border-top:1px solid #CCCCCC;  
    34. }  
    35. .autoSelectDiv ul li:hover {  
    36.     #ddd;  
    37. }  
    38. .autoSelectDiv .active {  
    39.     #3276b1;  
    40.     color: #ffffff;  
    41. }  
    Js代码  收藏代码
    1. /*** 
    2.  * 自动补全下拉框 
    3.  * (下拉框插件核心方法) 
    4.  * 输入框设置:class="autoSelect" 普通下拉框 
    5.  * 输入框设置:class="cascadeAutoSelect"      级联下拉框 
    6.  * 可以设置的一些自定义属性: 
    7.  *      name=""     选中后的值对应的字段 
    8.  *      textName="" 选中后的显示文本的内容对应的字段 
    9.  *      dftVal=""   默认选中的值 
    10.  *      dftCon=""   默认的检索条件,如级联选择的时候上级选中的值做为它的默认检索条件,输入检索之外的条件 
    11.  *      url=""      下拉框数据来源 
    12.  * 使用的时候 $("#containerId").autoSelect(function() {}); 
    13.  * 使用的时候 $("#containerId").autoSelect(function() {}); 
    14.  * @param $ 
    15.  */  
    16. (function($){  
    17.     $.fn.autoSelect = function(callback) {  
    18.         $(this).find(".autoSelect").each(function(i, v) {  
    19.             initAutoSelect(this, callback);  
    20.         });  
    21.     },  
    22.     $.fn.cascadeAutoSelect = function(callback) {  
    23.         initAutoSelect(this, callback);  
    24.     }  
    25. })(jQuery);  
    26.   
    27. /*** 
    28.  * 初始化AutoSelect 
    29.  * @param inputAuto 
    30.  * @return 
    31.  */  
    32. function initAutoSelect(inputAuto, callback) {  
    33.     // 输入框  
    34.     $(inputAuto).attr("autocomplete", "off");  
    35.     var codeName = $(inputAuto).attr("name");  
    36.     var textName = $(inputAuto).attr("textName");  
    37.     $(inputAuto).removeAttr("name");  
    38.     var inputHdCode = '<input type="hidden" class="hdCode" name="'+codeName+'" />';  
    39.     var inputHdName = '<input type="hidden" class="hdName" name="'+textName+'" />';  
    40.     var htmlDiv = '<div class="autoSelectDiv" isHover="false" ></div>';  
    41.     if($(inputAuto).parent().find("div.autoSelectDiv").length==0) {  
    42.         $(inputAuto).after(htmlDiv).after(inputHdName).after(inputHdCode);  
    43.     } else {  
    44.         $(inputAuto).parent().find("div.autoSelectDiv").removeAttr("style");  
    45.     }  
    46.     var isCalcLen = false; // 第一次点击的时候重新计算一下div的宽度,优化  
    47.     var isCalcLen1 = false; // 第一次点击的时候重新计算一下div的宽度,优化  
    48.     $(inputAuto).unbind("focus").focus(function(){  
    49.         var divAT = $(this).parent().find(".autoSelectDiv");  
    50.         var inputWidth = $(this).outerWidth();  
    51.         var divWidth = $(divAT).outerWidth();  
    52.         if(!isCalcLen && parseInt(divWidth) < parseInt(inputWidth)) {  
    53.             isCalcLen = true;  
    54.             $(divAT).css({ parseInt(inputWidth)});  
    55.         }  
    56.         divWidth = $(divAT).outerWidth();  
    57.         if(!isCalcLen1 && $(divAT).find("ul li").length>10) {  
    58.             isCalcLen1 = true;  
    59.             $(divAT).css({ parseInt(divWidth) + 17});  
    60.         }  
    61.         $(divAT).show();  
    62.     });  
    63.       
    64.     // 显示div  
    65.     var divAuto = $(inputAuto).parent().find(".autoSelectDiv");  
    66.       
    67.     $(divAuto).unbind("hover")  
    68.     .hover(  
    69.             function() {  
    70.                 $(this).attr("isHover", "true");  
    71.             }, function() {  
    72.                 $(this).attr("isHover", "false");  
    73.             });  
    74.     $(inputAuto).unbind("hover")  
    75.     .hover(  
    76.             function() {  
    77.                 $(this).attr("isHover", "true");  
    78.             }, function() {  
    79.                 $(this).attr("isHover", "false");  
    80.             });  
    81.     $(inputAuto).unbind("blur").blur(function(){  
    82.         var isHover = $(divAuto).attr("isHover");  
    83.         if(isHover!="true") {  
    84.             $(divAuto).hide();  
    85.             if(callback && typeof(callback)=="function") {  
    86.                 callback($(inputAuto));  
    87.             }  
    88.         }  
    89.     });  
    90.     $("body").unbind("click").click(function(){  
    91.         var isDivHover = $(divAuto).attr("isHover");  
    92.         var isInputHover = $(inputAuto).attr("isHover");  
    93.         if(isDivHover=="false" && isInputHover=="false") {  
    94.             $(divAuto).hide();  
    95.             if(callback && typeof(callback)=="function") {  
    96.                 callback($(inputAuto));  
    97.             }  
    98.         }  
    99.     });  
    100. }  
    Js代码  收藏代码
    1. var optionAllText = "------- 全部 -------";  
    2. /*** 
    3.  * 绑定自动补全下拉框 
    4.  * @param contanerId 容器ID 
    5.  * @param ifAll 是否需要全选 
    6.  * @param callback 回调函数 
    7.  * @return 
    8.  */  
    9. function bindAutoSelect(contanerId, ifAll, callback){  
    10.     $("#"+contanerId).autoSelect(function(inputAutoObj){  
    11.             // 如果没有选择,关闭选项div的时候清空输入框的内容  
    12.             var hdCode = $(inputAutoObj).parent().find("input[type='hidden'].hdCode").val();  
    13.             if(hdCode=="" && $(inputAutoObj).val()!=optionAllText) {  
    14.                 $(inputAutoObj).val("");  
    15.                 var dftCon = $(inputAutoObj).attr("dftCon");  
    16.                 loadSelectOptions($(inputAutoObj).attr("url"), "", inputAutoObj, ifAll, false, "", dftCon, "autoSelect", callback);  
    17.             }  
    18.         });  
    19.     $("#"+contanerId + " .autoSelect").each(function(){  
    20.         var inputAuto = $(this);  
    21.         bindSelect(inputAuto, "autoSelect", ifAll, callback);  
    22.     });  
    23. }  
    24.   
    25. /*** 
    26.  * 绑定自动补全下拉框(可做级联) 
    27.  * 给某个输入框绑定下拉功能 
    28.  * @param selectId 元素ID 
    29.  * @param ifAll 是否需要全选 
    30.  * @param callback 回调函数 
    31.  * @return 
    32.  */  
    33. function bindCascadeAutoSelect(selectId, ifAll, callback){  
    34.     $("#"+selectId).cascadeAutoSelect(function(inputAutoObj){  
    35.             // 如果没有选择,关闭选项div的时候清空输入框的内容  
    36.             var hdCode = $(inputAutoObj).parent().find("input[type='hidden'].hdCode").val();  
    37.             if(hdCode=="" && $(inputAutoObj).val()!=optionAllText) {  
    38.                 $(inputAutoObj).val("");  
    39.                 var dftCon = $(inputAutoObj).attr("dftCon");  
    40.                 loadSelectOptions($(inputAutoObj).attr("url"), "", inputAutoObj, ifAll, false, "", dftCon, "cascadeAutoSelect", callback);  
    41.             }  
    42.         });  
    43.     var inputAuto = $("#"+selectId);  
    44.     bindSelect(inputAuto, "cascadeAutoSelect", ifAll, callback);  
    45. }  
    46.   
    47. /*** 
    48.  * 绑定初始下拉 
    49.  * @param inputAuto 
    50.  * @param selectClass过滤autoSelect的class属性值 (autoSelect、cascadeAutoSelect) 
    51.  * @param ifAll 
    52.  * @param callback 
    53.  * @return 
    54.  */  
    55. function bindSelect(inputAuto, selectClass, ifAll, callback) {  
    56.     $(inputAuto).attr("placeholder","------- 请选择 ------");  
    57.     var filterText = "";  
    58.     var dftVal = $(inputAuto).attr("dftVal"); // 默认选中值属性  
    59.     var dftCon = $(inputAuto).attr("dftCon"); // 默认条件,如级联时上级选择的条件  
    60.     var url = $(inputAuto).attr("url");  
    61.       
    62.     if(dftVal) {  
    63.         loadSelectOptions(url, filterText, inputAuto, ifAll, true, dftVal, dftCon, selectClass, callback);  
    64.     } else {  
    65.         loadSelectOptions(url, filterText, inputAuto, ifAll, true, "", dftCon, selectClass, callback);  
    66.     }  
    67.       
    68.     var origVal = "";  
    69.     $(inputAuto).focus(function() {  
    70.         origVal = $(this).val();  
    71.     });  
    72.     var origValKeyUp = "";  
    73.     $(inputAuto).keyup(function(){  
    74.         if($(this).val() && $(this).val()==origVal) {  
    75.             return;  
    76.         }  
    77.         if(origVal==optionAllText) {  
    78.             origVal = "";  
    79.             $(this).val("");  
    80.         }  
    81.         var text = $(this).val();  
    82.         if(origValKeyUp==text) {  
    83.             return;  
    84.         }  
    85.         origValKeyUp = text;  
    86.         $(this).parent().find("input[type='hidden'].hdCode").val("");  
    87.         $(this).parent().find("input[type='hidden'].hdName").val("");  
    88.         loadSelectOptions(url, text, this, ifAll, false, "", dftCon, selectClass, callback);  
    89.     });  
    90. }  
    91.   
    92. /*** 
    93.  * 加载下拉列表 
    94.  * @param url 
    95.  * @param filterText 
    96.  * @param inputAuto 
    97.  * @param ifAll 是否需要全选 
    98.  * @param isLoad 默认加载(true页面进来自动加载,false:输入检索自动补全时) 
    99.  * @param dftVal 默认选项值 
    100.  * @param dftCon 默认条件,如级联下拉时上级选中的值 
    101.  * @param selectClass过滤autoSelect的class属性值 (autoSelect、cascadeAutoSelect) 
    102.  * @param callback 回调 
    103.  * @return 
    104.  */  
    105. function loadSelectOptions(url, filterText, inputAuto, ifAll, isLoad, dftVal, dftCon, selectClass, callback) {  
    106.     $.ajax({  
    107.         url: url,  
    108.         type:"post",  
    109.         data:{filterText:filterText,dftCon:dftCon},  
    110.         success:function(data){  
    111.             var divAuto = $(inputAuto).parent().find(".autoSelectDiv");  
    112.             if(data && data.length>0){  
    113.                 if(!(data instanceof Array)) {  
    114.                     $(divAuto).html('<ul><li class="text-center text-danger">无法获取数据</li></ul>');  
    115.                     return;  
    116.                 }  
    117.                 var hdCode = $(inputAuto).parent().find("input[type='hidden'].hdCode");  
    118.                 var hdName = $(inputAuto).parent().find("input[type='hidden'].hdName");  
    119.                 var htmlUl = '<ul>';  
    120.                 // 加载的时候, 有默认值就选择默认值, 没有就默认选择第一个  
    121.                 if(dftVal) {  
    122.                     if(ifAll===true && (filterText=="" || filterText==optionAllText)) {  
    123.                         htmlUl += '<li code="">'+optionAllText+'</li>';  
    124.                     }  
    125.                     for(var i=0; i<data.length; i++) {  
    126.                         var vCode = data[i]["code"];  
    127.                         var vName = data[i]["name"];  
    128.                         if(dftVal==vCode) {  
    129.                             htmlUl += '<li code="'+vCode+'" class="active">'+vName+'</li>';  
    130.                             $(inputAuto).val(vName);  
    131.                             $(hdCode).val(vCode);  
    132.                             $(hdName).val(vName);  
    133.                         } else {  
    134.                             htmlUl += '<li code="'+vCode+'">'+vName+'</li>';  
    135.                         }  
    136.                     }  
    137.                 } else {  
    138.                     if(ifAll===true && (filterText=="" || filterText==optionAllText)) {  
    139.                         if(isLoad || $(inputAuto).val()==optionAllText) {  
    140.                             htmlUl += '<li code="" class="active">'+optionAllText+'</li>';  
    141.                         } else {  
    142.                             htmlUl += '<li code="">'+optionAllText+'</li>';  
    143.                         }  
    144.                     }  
    145.                     for(var i=0; i<data.length; i++) {  
    146.                         var vCode = data[i]["code"];  
    147.                         var vName = data[i]["name"];  
    148.                         if(i==0) {  
    149.                             // 如果是输入检索自动补全的时候, isLoad为false  
    150.                             if(ifAll===true && isLoad) {  
    151.                                 $(inputAuto).val(optionAllText);  
    152.                                 htmlUl += '<li code="'+vCode+'">'+vName+'</li>';  
    153. //                              $(hdCode).val("");  
    154. //                              $(hdName).val("");  
    155.                             } else if(isLoad) {  
    156.                                 htmlUl += '<li code="'+vCode+'" class="active">'+vName+'</li>';  
    157.                                 $(inputAuto).val(vName);  
    158.                                 $(hdCode).val(vCode);  
    159.                                 $(hdName).val(vName);  
    160.                             } else {  
    161.                                 htmlUl += '<li code="'+vCode+'">'+vName+'</li>';  
    162.                             }  
    163.                         } else {  
    164.                             htmlUl += '<li code="'+vCode+'">'+vName+'</li>';  
    165.                         }  
    166.                     }  
    167.                 }  
    168.                 htmlUl += '</ul>';  
    169.   
    170.                 $(divAuto).html(htmlUl);  
    171.                 $(divAuto).find("ul li").unbind("click").click(function(){  
    172.                     var code = $(this).attr("code");  
    173.                     var name = $(this).html();  
    174.   
    175.                     var cnt = $(this).parent().parent().parent();  
    176.                     $(cnt).find("input[type='hidden'].hdCode").val("");  
    177.                     $(cnt).find("input[type='hidden'].hdName").val("");  
    178.                     var ia = $(this).parent().parent().parent().find("." + selectClass);  
    179.                     if(code=="" && name==optionAllText) {  
    180.                         $(ia).val(optionAllText);  
    181.                     }  
    182.   
    183.                     $(divAuto).hide();  
    184.                       
    185.                     loadSelectOptions(url, "", $(ia), ifAll, false, code, dftCon, selectClass, callback);  
    186.                 });  
    187.                   
    188.                 // 回调函数  
    189.                 if(callback && typeof(callback)=="function") {  
    190.                     callback($(inputAuto).next("input[type='hidden'].hdCode").val());  
    191.                 }  
    192.             } else {  
    193.                 $(divAuto).html('<ul><li class="text-center text-danger">无匹配项</li></ul>');  
    194.             }  
    195.         }  
    196.     });  
    197. }  
     
  • 相关阅读:
    09-异常处理-成绩判断异常
    继承与多态———动手动脑
    课下作业04-2String的使用方法
    课下作业04-1字符串加密
    课下作业03-2动手动脑及验证
    课下作业03-1请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?
    课下作业02-动手动脑
    Myschool试题
    使用ADO.NET
    模糊查询和聚合函数
  • 原文地址:https://www.cnblogs.com/onetwo/p/6277039.html
Copyright © 2011-2022 走看看