【问题标题】:How to create a basic jQuery dropdown menu?如何创建一个基本的 jQuery 下拉菜单?
【发布时间】:2016-01-03 18:44:59
【问题描述】:

我对 jQuery 非常陌生,并为我自己的项目创建了一个下拉菜单插件。我在下面有这个 Javascript 代码:

(function($){
$.fn.dev_dropdown = function(o, callback) {
    var defaults = {
        after: function(e) {},
        during: function(e) {},
        before: function(e) {},
        afterEachAnimation: function(e) {}
    }
    if(typeof callback == 'function') {
        defaults.after = callback;
    }
    var o = $.extend(defaults, o || {});
    return this.each(function() {
        var ths = $(this),
            childUL = ths.children("ul");

        ths.off('click').on('click', function(e){
            if(!ths){
                childUL.removeClass('dev_dropdown_open');
            }
            else {
                childUL.addClass("dev_dropdown_open");
            }
            return false;
        });

        $(document).on('click', function(){
            childUL.removeClass('dev_dropdown_open');
        });
    });
}
})(jQuery);

这是我的 CSS:

.dev_dropdown {
    position: relative;
    float: left;
}

.dev_dropdown > ul {
    display: none;
    position: absolute;
    top: 100%;
    right: 0; /* dropdown left or right */
    z-index: 1000;
    min-width: 150px;
    list-style: none;
    padding: 0;
    margin: 0;
    background: #fff;
    border: 1px solid #1976d2;
}

.dev_dropdown .dev_dropdown_open {
    display: block;
}

.dev_dropdown .dev_dropdown_open li {
    width: 100%;
    display: block;
}

.dev_dropdown .dev_dropdown_open li a {
    display: block;
    padding: 10px;
    color: #999;
    text-decoration: none;
}


.dev_dropdown .dev_dropdown_open li a:hover {
    background: #f4f4f4;
    color: #000;
}

这是我的 HTML

    <div class="page_content">
        <div class="page_content_inner">
            <div class="col_3">
                <div class="dev_card">
                    <div class="dev_card_toolbar">
                        <div class="toolbar_action">
                            <ul>
                                <li class="dev_dropdown">
                                    <a class="riplink" href="#"><i class="devs devs-more-vert"></i></a>
                                    <ul>
                                        <li><a href="#">item</a></li>
                                        <li><a href="#">item</a></li>
                                        <li><a href="#">item</a></li>
                                        <li><a href="#">item</a></li>
                                    </ul>
                                </li>
                                <li><a class="riplink" href="#"><i class="devs devs-fullscreen"></i></a></li>
                            </ul>
                        </div>
                        Directory
                    </div>
                    <div class="dev_card_content">

                    </div>

                </div>

            </div>
            <div class="col_9">
                <div class="dev_card">
                    <div class="dev_card_toolbar">
                        <div class="toolbar_action">
                            <ul>
                                <li class="dev_dropdown">
                                    <a class="riplink" href="#"><i class="devs devs-more-vert"></i></a>
                                    <ul>
                                        <li><a href="#">item</a></li>
                                        <li><a href="#">item</a></li>
                                        <li><a href="#">item</a></li>
                                        <li><a href="#">item</a></li>
                                    </ul>
                                </li>
                                <li><a class="riplink" href="#"><i class="devs devs-fullscreen"></i></a></li>
                            </ul>
                        </div>
                        Directory
                    </div>
                    <div class="dev_card_content">
                        sddfggf
                    </div>

                </div>
            </div>
        </div>
    </div>

当我点击另一个下拉菜单时,两个下拉菜单同时显示。请帮帮我。

【问题讨论】:

  • 您必须正确使用this关键字。向我们展示您的 HTML,以便我们为您提供帮助。

标签: javascript jquery html css drop-down-menu


【解决方案1】:

看起来您在两个菜单中使用相同的类,我猜是 .dev_dropdown,每个菜单使用不同的类,如果不是原因,您的 HTML 代码会有所帮助。
另一种方法是将点击事件处理程序单独绑定到每个元素,使用.each 回调函数中的元素参数,它是对集合中当前元素的引用。并且还使用'e.stopPropagation'防止事件冒泡到父元素

return this.each(function(i, element) {
        var ths = $(element),
            childUL = ths.children("ul");

        ths.off('click').on('click', function(e){
            e.stopPropagation();
            if(!ths){
                childUL.removeClass('dev_dropdown_open');
            }
            else {
                childUL.addClass("dev_dropdown_open");
            }
            return false;
        });

        $(document).on('click', function(){
            childUL.removeClass('dev_dropdown_open');
        });
    });

【讨论】:

  • 是的!我对两个菜单使用相同的类 .dev_dropdown 。但我想那样使用。就像我调用 Bootstrap 时的多个下拉菜单一样,它们都具有相同的类。
  • 您可以在单击处理程序中尝试 e.stopPropagation() ,就在添加/删除类的代码之前,您可以尝试的另一个方法是检查“this”是否是您单击的菜单:而不是 else - 使用 else if (ths === e.target)
  • 第三个选项是,您可以将参数传递给每个回调函数并将迭代元素分配给您的 ths 变量: .each(function(index, element){ var ths = $(element) }
  • 因为this,内部.each 函数是所有选定html元素的集合,这意味着您为整个集合注册了“点击”事件。抱歉,帖子之间的延迟,但我这里的互联网连接较弱。
  • 谁能给我完整的工作代码,我不明白该怎么做。到目前为止,我没有得到任何具体的答案。我告诉过我是 jquery 的新手。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多