无法选择除一个之外的所有元素

时间:2015-04-08 21:23:50

标签: javascript jquery jquery-selectors

我试图在一个函数中选择除一个页面之外的所有页面元素:

$('#sidebutton').click(function () {

if (!$('.sidemenu').hasClass("current")) {
    prevScrolPos = $(window).scrollTop();
    scrollTo = 0;
} else {
    scrollTo = prevScrolPos;
}

$('.hidelem').toggleClass("hidden");
$('.sidemenu').toggleClass("current"); 
$('html,body').scrollTop(scrollTo);
});

当我使用一个简单的类选择器(.hidelem)时,它可以工作,但是当我使用一些更复杂的东西时(例如,$("*:not(.sidemenu)").toggleClass("hidden");$("*").not(".sidemenu").toggleClass("hidden");)则不行;这些只是导致一个空白的窗口。

你能告诉我我在这里缺少什么吗?

JSFiddle:https://jsfiddle.net/et978wjw/5/(缺少完整功能,但我希望你明白这一点)

1 个答案:

答案 0 :(得分:0)

问题是您可能正在使用.sideMenu跳过$("body *:not(.sidemenu)"),但您没有跳过其父DIV。如果你隐藏了一个祖先,你也隐藏了它的所有后代。您也不会跳过任何后代,因此.sidemenu的孩子也会隐藏

所以你需要用:not:(has())排除任何作为.sidemenu祖先的东西,然后排除sidemenu本身,然后排除任何sidemenu的孩子:

$("#container :not(:has(.sidemenu)):not(.sidemenu):not('.sidemenu *')").toggleClass("hidden");

JSFiddle: https://jsfiddle.net/TrueBlueAussie/et978wjw/8/

你真的应该将hide / show指向更具体的东西。也许你想隐藏的一切包装div?我为演示添加了一个。

现在说了这么多,你的选择过程非常复杂。你最好只是在你要切换的所有东西上添加一个类,然后切换那些(你已经在div上有nodisplay,所以我现在就用它了。)

e.g。就是这样:

$(".nodisplay").toggleClass("hidden");

JSFiddle: https://jsfiddle.net/TrueBlueAussie/et978wjw/9/