jquery 大法好

应用后台开发的时候,写前端是难免的。
可编辑下拉框,很多框架有实现,但总会碰到框架支持不好(比如layui)或者没有引入框架的情况。

网上找打原生实现的例子,鉴于前端写得少,转载记录之:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>自定义下拉选择框</title>
    <style type="text/css">
    * {
        margin: 0;
        padding: 0;
    }

    ul,li {
        list-style: none;
    }

    :focus {
        outline: none;
    }

    input[type=text] {
        border: 1px solid #ccc;
    }

    input[type=text]:hover,
    input[type=text]:focus {
        border-color: #57bc80;
        box-shadow: none;
    }

    body {
        padding: 50px;
        font-size: 12px;
    }

    .my-select-box {
        position: relative;
    }

    .my-select-box .my-select-input {
        height: 24px;
        line-height: 24px;
        padding: 0 5px;
        padding-right: 20px !important;
        width: 100%;
        box-sizing: border-box;
    }

    .my-select-box .my-select-list {
        position: absolute;
        left: 0;
        z-index: 101;
        border: 1px solid #ccc;
        border-top: none;
        max-height: 120px;
        overflow-y: auto;
        display: none;
        background: #fff;
        width: 100%;
        box-sizing: border-box;
    }

    .my-select-box .my-select-list li {
        height: 22px;
        line-height: 22px;
        padding: 0 3px;
        cursor: pointer;
        margin-bottom: 1px
    }

    .my-select-box .my-select-list li.choosed {
        background: #ccc;
        color: #fff;
    }

    .my-select-box .my-select-list li:hover {
        background: #ccc;
        color: #fff;
    }
    </style>
</head>

<body>
    <div class="my-select-box" style="width:300px;">
        <input type="text" class="my-select-input" placeholder="可输入也可选择" maxlength="20" />
        <ul class="my-select-list">
            <li data-value="1">第一项</li>
            <li data-value="2">第二项</li>
            <li data-value="3">第三项</li>
        </ul>
    </div>
    <div style="height: 30px"></div>
    <div class="my-select-box">
        <input type="text" class="my-select-input" placeholder="可输入也可选择" maxlength="20" />
        <ul class="my-select-list">
            <li data-value="1">第一项</li>
            <li data-value="2">第二项</li>
            <li data-value="3">第三项</li>
        </ul>
    </div>
    <script type="text/javascript" src="jquery-3.2.1.min.js"></script>
    <script>
    ;
    (function($) {
        $.fn.MySelect = function() {
            this.each(function() {
                var $box = $(this);
                var $input = $box.find("input.my-select-input"); //输入框
                var $list = $input.next(); //ul装扮成下拉框

                //计算input输入框的高度和宽度,方便定位ul和设置ul及包裹元素的宽度
                var inputHeight = $input.outerHeight();
                //var inputWidth=$input.innerWidth();
                $list.css({ "top": (inputHeight) });
                //$box.width($input.outerWidth());

                $input.focus(function() {
                    //输入框获得焦点后,显示下拉选择ul
                    var $nextUl = $(this).next();
                    if ($nextUl.children().length > 0) {
                        $(this).next().show();
                    }
                }).bind('input propertychange', function() {
                    //绑定监测输入框的输入值更改
                    var $this = $(this);
                    $this.attr("data-id", "");
                    var curText = $this.val();
                    var $nextUl = $(this).next();
                    if ($nextUl.children().length > 0) {
                        $nextUl.find("li").removeClass("choosed");
                        $nextUl.find("li").each(function(i, item) {
                            var txt = $(item).text();
                            if (txt === curText) {
                                var v = $(item).attr("data-value");
                                $this.attr("data-id", v);
                                $(item).addClass("choosed");
                            }
                        });
                    }
                });
                //修改成如下事件绑定,为了给动态添加的li也可以产生点击效果
                $list.off('click', 'li').on('click', 'li', function(e) {
                    var $this = $(this);
                    var value = $this.attr("data-value") || '';
                    $input.val($this.text()).attr("data-id", value);
                    $this.addClass("choosed").siblings().removeClass("choosed");
                    $this.parent().hide();
                });
            });

            //点击.my-select-box范围外时隐藏ul下拉框
            $(document).click(function(e) {
                var target = e.target;
                var $target = $(target);
                var $parent = $target.closest('.my-select-box');

                if ($parent.length < 1) {
                    //说明不是.my-select-box范围内点击,将ul隐藏
                    $(".my-select-list").hide();

                } else if ($parent.length == 1) {
                    //如果存在多个my-select-box的情况,将其余的非这项以外的都隐藏
                    var $ul = $parent.find(".my-select-list");
                    var flag = $ul.is(":hidden");
                    $(".my-select-list").hide();
                    if (!flag) $ul.show();
                }
            });
            return this;
        }
    })(jQuery);

    $(".my-select-box").MySelect();
    </script>
</body>

</html>

转自 原文