3

次のコードがあり、<ul>クリックすると内容がドロップダウンします。それはうまくいきます。child <li>問題は、をクリックすると、同じタイプの他のメニューも閉じてしまうことでした。

クリックされているアイテムが現在開いているアイテムでもあるかどうかを判断する句を使用して、この問題を「修正」しましたが、さらに一歩進んで、親が再度クリックされた場合に閉じるifようにしたいと思いますメニュー。これにアプローチする方法について、私は多くの誤解を持っています。子要素の伝播を停止しようとしましたが、同じ結果が得られます。誰でも手伝ってもらえますか? ul

配線(ドキュメントロード)

$(document).ready(function () {
                $('[data-role="sidebar-dropdown"]').drawer({
                    open: 'sidebar-dropdown-open',
                    css: '.sidebar-dropdown-open'
                });
        });

html

<ul>
    <li class=" dropdown" data-role="sidebar-dropdown">
        <a href="pages/.." class="remote">Link Text</a>
        <ul class="sub-menu light sidebar-dropdown-menu">
            <li><a class="remote" href="pages/...">Link Text</a></li>
            <li><a class="remote" href="pages/...">Link Text</a></li>
            <li><a class="remote" href="pages/...">Link Text</a></li>
        </ul>
    </li>
</ul>

JavaScript

(function ($) {
    $.fn.drawer = function (options) {
        // Create some defaults, extending them with any options that were provided
        var settings = $.extend({
            open: 'open',
            css: '.open'
        }, options);

        return this.each(function () {
            $(this).on('click', function (e) {
                // slide up all open dropdown menus
                $(settings.css).not($(this)).each(function () {
                    $(this).removeClass(settings.open);
                    // retrieve the appropriate menu item
                    var $menu = $(this).children(".dropdown-menu, .sidebar-dropdown-menu");
                    // slide down the one clicked on.
                    $menu.slideUp('fast');
                    $menu.removeClass('active');
                });


                // mark this menu as open
                $(this).addClass(settings.open);

                // retrieve the appropriate menu item
                var $menu = $(this).children(".dropdown-menu, .sidebar-dropdown-menu");
                // slide down the one clicked on.
                $menu.slideDown(100);
                $menu.addClass('active');
                e.preventDefault();
                e.stopPropagation();

            }).on("mouseleave", function () {
                $(this).children(".dropdown-menu").hide().delay(300);
            });

        })
    };

})(jQuery);
4

1 に答える 1

2

jQuery イベントでは、 を参照してイベントを開始したノードを読み取ることができますe.target

if ($(e.target).is("li")) { // do something only if the clicked element was a li }

子ではない要素を閉じることに関しては、グローバル セレクター$(selector)を実行する代わりに、開始 dom ノードに関連するセレクターを実行する必要があります。thisjQuery プラグイン内に渡して隠しておくのが一般的な方法です。

return this.each(function(this)) { var $node = $(this); }

次に、すべてのルックアップは次のように行われます

$node.find(selector).doStuff()

于 2012-12-05T20:57:04.103 に答える