1

私はこのセレクターを持っています:

$('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ステートメントで使用します。つまり、リストアイテムではなく、そのリストアイテムに関連している必要があります。

このようなもの:

$("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 に答える