javascript - 如何在单击下拉列表外部时关闭下拉列表,但在选择文本区域时阻止其关闭?

标签 javascript jquery

我创建了一个下拉 list ,当选中最后一个选项时,它会打开一个文本区域。 当我点击下拉菜单外部时,我需要能够关闭下拉菜单。 我正在使用此代码

    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Title</title>
    <meta name="author" content="">

    <script src="js/jquery.min.js"></script>  
</head>
<body>
<div class="row inner-container">
                    <div class="group">
                        <div class="styled-select control-group">
                            <div class="controls">
                                <div id="list2" class="dropdown-check-list" tabindex="100">
                                    <span class="anchor">-- Selecteer uw reparatie --</span>
                                    <ul class="items">
                                        <li class="item first-item">
                                            <input id="dropdown-check-list-01" type="checkbox" />
                                            <label for="dropdown-check-list-01"><span></span>option 1</label>                                            
                                        </li>           
                                        <li class="item">
                                            <input id="dropdown-check-list-02" type="checkbox" />
                                            <label for="dropdown-check-list-02"><span></span>option 2</label>
                                        </li>
                                        <li class="item overige">
                                            <input id="dropdown-check-list-07" type="checkbox" name="messagetick" />
                                            <label for="dropdown-check-list-07"><span></span>Other</label>
                                            <div class="contactmessage">
                                                <textarea name="setmessage" cols="25" rows="5"></textarea>
                                            </div>
                                            <script type="text/javascript">
                                                $('input[name="messagetick"]').click(function() {
                                                    $('.contactmessage').toggle(this.checked);
                                                });
                                                $('input[name="messagetick"]').change(function(){
                                                    if($(this).is(":checked")) {
                                                        $('li.overige').addClass("checked");
                                                    } else {
                                                        $('li.overige').removeClass("checked");
                                                    }
                                                });
                                            </script>
                                        </li>

                                    </ul>                            
                                </div>
                            </div>
                        </div>
                        <script type="text/javascript">                    
                            jQuery(function ($) {
                                var checkList = $('.dropdown-check-list');
                                checkList.on('click', 'span.anchor', function(event){
                                    var element = $(this).parent();

                                    if ( element.hasClass('visible'))
                                    {
                                        element.removeClass('visible');
                                    }
                                    else
                                    {
                                        element.addClass('visible');
                                    }

                                    checkList.on("blur", function() {
                                        if ($("textarea[name='setmessage']").not(':focus')) {
                                            element.removeClass('visible');
                                        }
                                    });
                                });
                            });

                        </script>
                    </div>
                </div>
<style>

.dropdown-check-list {
    border-radius: 2px;
    display: inline-block;
    padding-left: 0;    
}

.dropdown-check-list .anchor {  
    cursor: pointer;
    display: inline-block;
    height: 47px;
    line-height: 48px;
    padding: 0 40px 0 20px;
    position: relative;
    width: 468px;
}

.dropdown-check-list ul.items {
    border-top: 1px solid #dedede;      
    display: none;
    margin: 0;
    padding: 0;

}

.dropdown-check-list ul.items li {
    height: 36x;
    list-style: none;
}

.dropdown-check-list ul.items li.item:hover {
    background: #005a84;
}

.dropdown-check-list ul.items li.item:hover label,
.dropdown-check-list ul.items li.item:hover .icon-info-sign {
    color: #fff;
}

.dropdown-check-list ul.items li.item:first-of-type {   
    margin-top: 10px;
}

.dropdown-check-list ul.items .totaalprijs {
    font-weight: bold;
    padding: 20px;
}

.dropdown-check-list.visible .items {
    display: block;
}

.dropdown-check-list input, .dropdown-check-list label {
    display: inline-block;
    line-height: 36px;
    margin: 0;
    width: auto;    
}

.dropdown-check-list input[type=checkbox] {
    display: none;
    margin: 0 20px; 
}

.dropdown-check-list label {
    color: #999;    
}

.dropdown-check-list input[type="checkbox"] + label span {
    background: url(../img/check_sheet.png) left -36px no-repeat;
    cursor: pointer;
    display: inline-block;    
    height: 20px;
    margin: 0 20px;
    vertical-align: middle;    
    width: 20px;
}

.dropdown-check-list input[type="checkbox"]:checked + label span {
    background: url(../img/check_sheet.png) left top no-repeat;
}

.dropdown-check-list .icon-info-sign {
    color: #999;
    line-height: 36px;  
}

.dropdown-check-list .other textarea {    
    display: block; 
    font-size: 14px;    
    margin: 25px auto 0;
    padding: 5px;
    width: -moz-calc(100% - 40px);
    width: -webkit-calc(100% - 40px);
    width: -o-calc(100% - 40px);
    width: calc(100% - 40px);   
}

.dropdown-check-list .checked {
    background-color: #acacac !important;
    padding-bottom: 30px;
}

.dropdown-check-list .checked label,
.dropdown-check-list .checked i {
    color: #fff;    
}

.dropdown-check-list .contactmessage {
    display: none;
}
</style>
</body>
</html>

这部分脚本是我在外部单击时用来关闭下拉列表的部分。

checkList.on( "blur", function(){
    element.removeClass('visible');
});

我遇到的问题是,当我尝试写入文本区域时,它也会关闭下拉列表。如何进行设置,以便在选择文本区域时不会关闭下拉列表?

最佳答案

我的一个 friend 帮我解决了这个问题,所以我将其发布在这里,供遇到同样问题的人使用。

$(document).mouseup(function (e) {
    var container = $('.dropdown-check-list');

    if (!container.is(e.target) && container.has(e.target).length === 0) {
        container.removeClass('visible');
    }
});

关于javascript - 如何在单击下拉列表外部时关闭下拉列表,但在选择文本区域时阻止其关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33348851/

相关文章:

javascript - 使用 facebook 图形 API 的长轮询(用于 "real-time"通知)

javascript - 禁用输入文本

javascript - jQuery 隐藏选项元素

javascript - Angular 4嵌套formArray/formGroup将数据库查询中的值放回表单中

javascript - 如何触发 JQuery 对话框以从 MVC 分部 View 的 Controller 关闭?

javascript - Webpack.config.js : Configuration has an unknown property 'default'

javascript - jqueryUI 可选择与 AngularJS 不适合我

javascript - 将所有 div 的大小调整为最高 div 的大小

javascript - 在 AngularJs Web 应用程序中存储以前的 URL

javascript - Jquery嵌套div数据表点击事件