1

我有这个选择器:

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

得到这些元素:

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

现在,我想在 if 语句中使用它,它位于悬停函数内部。换句话说,它必须是相对于该列表项而不是列表项。

像这样的东西:

$("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 选择器有关,但我似乎无法调试它:上面的代码选择了所有列表项而没有区别。

4

1 回答 1

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

正如MDN所写:

可以转换为 false 的表达式示例是计算结果为 null、0、空字符串 ("") 或未定义的表达式

于 2013-01-12T13:17:33.423 回答