自定义下拉框联动查询

2021-02-14  本文已影响0人  五岁小孩

<center><font size="5"> 自定义输入下拉框联动查询</center></font>

html

该div只有部分样式,其中input 中class为 input-select 必须有

该 ul 的class必须添加 ul下的li的内容及其自定义属性自行定义

   <script type="text/javascript" src="/assets/js/jquery-1.11.1.min.js"></script>
   <link href="input-select.css" rel="stylesheet" type="text/css" />
   <script src="input-select.js"></script>
   <script src="test-mail.js"></script>

<div class="form-group">
       <label for="Name" class="col-sm-2 control-label form-label">
           {{TPFunTi18nLang $.i18n.lang "data" "export.setting.tb.name"}}
       </label>
       <div class="col-sm-6">
           <input type="text" class="form-control input-select margin-b-5" value=""
                  id="input-select">

           <ul class="input-select-ul">
               <li value="" >没有数据</li>
           </ul>
       </div>
</div>

css

input-select.css

.input-select-ul{
    display: none;
    width: 96%;
    margin-left: 2px;
    list-style: none;
    position: absolute;
    padding: 5px 0;
    border: 0.1rem solid #0b87e3;
   /* border-top: 0;*/
    z-index: 1000;
    background-color: #ffffff;
}
.input-select-ul li{
    display: block;
    padding: 2px 5px;
    color: #000;
    text-decoration: none;
}
.input-select-ul li:hover{
    background-color: #399bff;
    color: #000;
}

js

input-select.js

$(function () {

    //监听输入框获取焦点事件
    // $(".input-select").focus(function () {
    //     $(this).siblings(".input-select-ul").show()
    // });
    //监听输入框的点击事件
    $(".input-select").on('click',function () {
        $(this).siblings(".input-select-ul").show()
    });
    //监听鼠标离开ul时监听事件
    $(".input-select-ul").mouseleave(function () {
        $(this).hide();
    });
    //监听li的点击事件
    // $(".input-select-ul li").on("click",function(){      //只需要找到你点击的是哪个ul里面的就行
    //     //输入框赋值
    //     $(this).parent().prev().val($(this).attr("value"));
    //     //隐藏下拉框
    //     $(this).parent().hide()
    // });
    $(document).on('click', '.input-select-ul li', function() {
        //输入框赋值
        $(this).parent().prev().val($(this).attr("value"));
        //隐藏下拉框
        $(this).parent().hide()
    });

});
/**
 * @function (通用方法,页面初始化时调用即可)根据指定搜索的值和指定搜索的字段从数组searchData中查询数据
 *@param domId  页面input的id
 *@param searchData 搜索的数据源
 * @param searchAttr 搜索的字段,多个字段以逗号分开
 * @param isLike   是否模糊查询;true-模糊匹配,false-完全匹配;默认false
 * @param showDefaultNum 当监听到input的值为空时显示默认条数,如果为0则默认不显示
 * @param noRewordTips  当搜索数据为空的提示信息
 * @param initUl  是否需要初始化Ul,默认不初始化,由于样式问题不建议初始化
 */
function initInputSelect(domId, searchData, searchAttr, isLike, showDefaultNum, noRewordTips,initUl) {

    //check input的id,搜索的原数据不能为空
    if (domId === "" || searchData === "" ||searchData.length===undefined || searchData.length <= 0 || searchAttr === "") {
        return
    }
    //默认模糊匹配
    if (isLike === "") {
        isLike = false
    }
    //默认当输入的值为空时显示5条,为0时不显示
    if (showDefaultNum === "" || parseInt(showDefaultNum) === undefined) {
        showDefaultNum = 5
    }
    //默认空记录显示信息
    if (noRewordTips===""){
        noRewordTips="没有检索到任何记录"
    }
    //默认不初始化
    if (initUl===""){
        initUl=false
    }
    //初始化 ul和li
    if (initUl===true){
        let ulHtml="<ul class=\"input-select-ul\" style=\"width: 99%;margin-top: -10px\">\n" +
            "<li value=\"\" >"+noRewordTips+"</li>\n" +
            "</ul>";
        $("#" + domId).after(ulHtml)
    }
    //默认li中的名称为搜索的字段的名称(多个时默认第一个)
    let defaultLiName = searchAttr.split(",")[0];
    //监听输入的输入的值的改变
    $("#" + domId).bind("input propertychange", function (event) {
        let inputVal = $(this).val();
        //没有值默认显示前5条
        if (isNull(inputVal) && showDefaultNum > 0) {
            //默认显示前5条
            $(searchData).each(function (i, v) {
                if (i === 0) {
                    $("#" + domId).next().children("li").remove();
                }
                if (i < showDefaultNum) {
                    let appendHtml = "<li  value=\"" + v[defaultLiName] + "\" >" + v[defaultLiName] + "</li>";
                    $("#" + domId).next().append(appendHtml)
                }
            });
            return
        }
        let searchArr = searchInputSelectData(searchData, searchAttr, inputVal, isLike);
        //清除下拉框的数据
        $(this).next().children("li").remove();
        if (searchArr.length) {
            for (let i = 0; i < searchArr.length; i++) {
                let v = searchArr[i];
                let appendHtml = "<li  value=\"" + v[defaultLiName] + "\" >" + v[defaultLiName] + "</li>";
                $(this).next().append(appendHtml)
            }

        } else {
            $(this).next().append("<li value=\"\" >" + noRewordTips + "</li>")
        }
    });
}


/**
 * @function 根据指定搜索的值和指定搜索的字段从数组searchData中查询数据
 *@param searchData 搜索的数据源
 * @param searchAttr 搜索的字段,多个字段以逗号分开
 * @param searchVal 搜索的值
 * @param isLike   是否模糊查询;true-模糊匹配,false-完全匹配;默认false
 * @returns Array{Array|*} 返回搜索结果,数组类型
 */
function searchInputSelectData(searchData,searchAttr,searchVal,isLike) {
    //return
    var returnArr = [];

    //check
    if (searchVal === "" || searchAttr === "" ||searchData===""||searchData.length<=0) {
        return returnArr;
    }
    //转换搜索的字段为数组类型
    let searchAttrArr = searchAttr.split(",");
    //默认完全匹配
    if (isLike === "") {
        isLike=false
    }
    let likePattern = new RegExp(searchVal);
    for (let i = 0; i < searchData.length; i++) {
        if (isLike) {
            //模糊查询
            for (let k=0;k<searchAttrArr.length;k++){
                if (likePattern.test(searchData[i][searchAttrArr[k]])) {
                    returnArr.push(searchData[i]);
                }
            }
        } else {
            //完全匹配
            for (let k=0;k<searchAttrArr.length;k++){
                if (searchVal === searchData[i][searchAttrArr[k]]) {
                    returnArr.push(searchData[i]);
                }
            }
        }
    }

    return returnArr;
}


/**
 *@function 演示
 * */
//定义查询的元数据
var searchData=[{
    "name": "aliyun",
    "host": "smtp.aliyun.com",
    "port": 25,
    "ssl": 465
},
    {
        "name": "gmail",
        "host": "smtp.gmail.com",
        "port": 587,
        "ssl": 465
    },
    {
        "name": "exmail",
        "host": "smtp.exmail.qq.com",
        "port": 587,
        "ssl": 465
    },
    {
        "name": "qq",
        "host": "smtp.qq.com",
        "port": 25,
        "ssl": 465
    },
    {
        "name": "qq",
        "host": "smtp.163.com",
        "port": 25,
        "ssl": 465
    }
];
    //页面加载完成时 添加input的焦点获取事件
    $("#input-select").bind("input propertychange", function (event) {
        //获取输入框输入的值
        let inputVal = $(this).val();

        //没有值默认显示前5条
        if (isNull(inputVal)) {
            //默认显示前5条
            $(mailDefaultData).each(function (i, v) {
                if (i === 0) {
                    $("#input-select").next().children("li").remove();
                }
                if (i < 5) {
                    let appendHtml = "<li  value=\"" + v.host + "\" >" + v.host + "</li>";
                    $("#input-select").next().append(appendHtml)
                }
            });
            return
        }
        //调用方法搜索数据
        let searchArr = searchInputSelectData(searchData,"host",inputVal, true);

        //清除下拉框的原有数据
        $(this).next().children("li").remove();
        if (searchArr.length) {
            for (let i = 0; i < searchArr.length; i++) {
                let v = searchArr[i];
                let appendHtml = "<li  value=\"" + v.host + "\" >" + v.host + "</li>";
                $(this).next().append(appendHtml)
            }

        } else {
            $(this).next().append("<li value=\"\" >没有检索到任何记录</li>")
        }
    });


上一篇下一篇

猜你喜欢

热点阅读