我有这个选择器:
$('ul:not(.sub-menu) > li, ul.sub-menu > li:last-child').not(':has(ul.sub-menu)');
获取这些元素:
li
的每个直接.sub-menu
后代(除非是最后一个,参见2。)ul.sub-menu
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
}
});
但这不起作用。我认为它与在if语句中组合OR和AND选择器有关,但我似乎无法调试它:上面的代码选择所有列表项而没有区别。
答案 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,空字符串(“”)或未定义