if语句中的OR和AND组合

我有这个选择器:

$('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每个最后一个li元素
  3. 排除作为ul.sub-menu父级的所有li

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

$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,空字符串(“”)或未定义的表达式