if语句中的OR和AND组合

时间:2013-01-12 13:15:48

标签: 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. ul.sub-menu
  3. 的每个最后一个li元素
  4. 排除所有li的父级ul.sub-menu
  5. 现在,我想在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
      }
    });
    

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

1 个答案:

答案 0 :(得分: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
}

详细信息:

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

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

if ($('#a').length) { // identical to last one

the MDN撰写:

  

可转换为false的表达式示例是那些   求值为null,0,空字符串(“”)或未定义