if语句中的OR和AND组合

Bra*_*roy 1 jquery if-statement jquery-selectors

我有这个选择器:

$('ul:not(.sub-menu) > li, ul.sub-menu > li:last-child').not(':has(ul.sub-menu)');

获得这些元素:

  1. li父母不是的 每个直系后裔.sub-menu(除非是最后一个,参见2).
  2. 每个最后的li元素 ul.sub-menu
  3. 排除li作为父母的所有人ul.sub-menu

现在,我想在if语句中使用它,它在hover-function中.换句话说,它必须是相对于列表项目,而不是作为列表项.

像这样的东西:

$("nav li").hover(function () {
  var $this = $(this); 
  if (($this.parent("ul:not(.sub-menu)") || ($this.parent("ul.sub-menu") && $this.is(":last-child"))) && $this.not(":has(ul.sub-menu)")) {
     // do something
  }
});
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我认为它与在if语句中组合OR和AND选择器有关,但我似乎无法调试它:上面的代码选择所有列表项而没有区别.

Den*_*ret 5

$this.parent("ul:not(.sub-menu)") 即使该集合为空,也绝不是假的.

使用$this.parent("ul:not(.sub-menu)").length,而不是在你的病情.

因此整个if语句看起来像这样:

if (
    (
        $this.parent("ul:not(.sub-menu)").length
        || ( $this.parent("ul.sub-menu").length && $this.is(":last-child") )
    ) && !$this.hasClass("sub-menu")
) {
     // do something
}
Run Code Online (Sandbox Code Playgroud)

细节 :

if ($('#a')) { // always verified

if ($('#a').length>0) { // verified if there is an element with id a

if ($('#a').length) { // identical to last one
Run Code Online (Sandbox Code Playgroud)

正如MDN所写:

可转换为false的表达式示例包括求值为null,0,空字符串("")或未定义的表达式