0

这个问题已经被问了三次,但我似乎无法让它发挥作用。这是一个小提琴。您可以通过单击链接来切换登录表单。如果您想隐藏它,您可以再次单击该链接,或在表单本身之外单击。

$j = jQuery.noConflict();

$j("a#login-link").click(function (e) {
    $j("div#custom-login").slideToggle("fast");
    e.preventDefault();
    e.stopImmediatePropagation();
});

$j(document).click(function (e) {
    if ($j("div#custom-login").is(":visible") && !$j("div#custom-login, div#custom-login *").is(e.target)) {
        $j("div#custom-login").slideUp("fast");
    }
});

问题是在表单内部点击仍然会隐藏表单——除非你点击边框,这很奇怪。一种解决方案是添加一个*选择器来获取所有子元素,如下所示:

$j(document).click(function (e) {
    if ($j("div#custom-login").is(":visible") && !$j("div#custom-login, div#custom-login *").is(e.target)) {
        $j("div#custom-login").slideUp("fast");
    }
});

但我无法想象它不能以其他方式完成?

4

3 回答 3

2

很简单,只需添加以下代码:

$j("div#custom-login").click(function (e) {
    e.stopPropagation();    
});

在这里演示

于 2013-04-19T08:54:42.613 回答
0

这行不是指定它在可见并且是选定目标时向上滑动吗?:O

if ($j("div#custom-login").is(":visible") && !$j("div#custom-login, div#custom-login *").is(e.target)) {
于 2013-04-19T08:51:37.100 回答
0

尝试

$j(document).click(function (e) {
    if ($j("div#custom-login").is(":visible") && !$j(e.target).closest("#custom-login").length) {
        $j("div#custom-login").slideUp("fast");
    }
});

演示:小提琴

重要说明 使用选择器是一种不好的做法,例如div#custom-login,如果您将 id 作为选择器,则仅#custom-login将其用作选择器

于 2013-04-19T08:48:45.257 回答