2

我正在尝试使用 jQuery 注册点击,并且填充似乎存在问题。

这是一个jsFiddle来帮助查看它。

我试图点击打开的菜单什么都不做,而点击其他任何地方都会关闭所有菜单。它工作得很好,但最大的问题是如果你点击上面<li>但仍然在<div>它失败。似乎填充不计入 div 或其他东西的一部分。

代码也在这里:

HTML

<a href="#mainMenu" class="menuLink">Main</a>
<div id="mainMenu" class="menu">
    <ul>
        <li class="menuItem"><a href="#">item 1</a>
        </li>
        <li class="menuItem"><a href="#">item 2</a>
        </li>
        <li class="menuItem"><a href="#">item 3</a>
        </li>
        <li class="menuItem"><a href="#">item 4</a>
        </li>
        <li class="menuItem"><a href="#">item 5</a>
        </li>
    </ul>
</div>
<a href="#menuTwo" class="menuLink">Menu 2</a>

<div id="menuTwo" class="menu">
    <ul>
        <li class="menuItem"><a href="#">item 1</a>
        </li>
        <li class="menuItem"><a href="#">item 2</a>
        </li>
        <li class="menuItem"><a href="#">item 3</a>
        </li>
        <li class="menuItem"><a href="#">item 4</a>
        </li>
        <li class="menuItem"><a href="#">item 5</a>
        </li>
    </ul>
</div>

JS

$(document).ready(function () {
    //Attach a handler to the document for clicks.
    $(document).on("click", function (e) {
        //Get the click's target and convert to $ object.
        $target = $(e.target);
        //Find out if the click occurred on a menu.
        $parents = $target.parents(".menu");
        if ($parents.length > 0) {
            console.log(["Menu click", e]);
            return;
        } else {
            //If it wasn't on a menu close the open menu.
            console.log(["Non-menu click", e]);
            $('.menu').hide();
        }
    });

    //Handle showing the menu.
    $('.menuLink').on("click", function (e) {
        //Close all other menus.
        $('.menu').hide();
        console.log("Started");
        e.stopPropagation();
        e.preventDefault();
        var targetMenu = $(e.target).attr("href");
        $(targetMenu).show();
    });

});

CSS

#mainMenu {
    background-color: lightblue;
}
#menuTwo {
    background-color: lightgreen;
}
.menu {
    display: none;
    border: 1px solid black;
}
4

3 回答 3

3

您的问题出在这一行:

$parents = $target.parents(".menu");

将其更改为:

$parents = $target.closest(".menu");

div 没有 class 的父级.menu,所以如果你点击它,它什么也找不到。closest在搜索中包含所选元素。

http://jsfiddle.net/ecnGr/

于 2013-08-15T19:10:06.200 回答
1

用于closest解决您的问题

$parents = $target.closest(".menu");

如果您仍想使用,parents则添加额外的检查以查看单击的元素是否为 div。

if ($parents.length > 0 || $target.is('.menu')) {

检查小提琴

您的代码的问题是该parents方法不包含有问题的元素。所以你必须明确地做那个检查,或者使用closest其中包括有element问题的。

于 2013-08-15T19:10:56.057 回答
1

您可以只使用菜单上的所有点击,这将起到作用。

$(document).ready(function () {
    //Attach a handler to the document for clicks.
    $(document).on("click", function (e) {
        $('.menu').hide();
    });

    $('.menuLink').on("click", function (e) {
        $('.menu').hide();
        e.stopPropagation();
        e.preventDefault();
        var targetMenu = $(e.target).attr("href");
        $(targetMenu).show();
    });

    //Handle showing the menu.
    $('.menu').on("click", function (e) {
         e.stopPropagation();
    });
});

http://jsfiddle.net/MightyPork/UCwAt/8/

于 2013-08-15T19:15:52.700 回答