2009-09-03 3 views
0

このシンプルなセレクターの問題は数時間で苦労しており、明らかに何かが欠けているはずです。私は<ul>を持っていて、<li>のいくつかは入れ子になっています。<ul> sです。各<li>にはリンクが含まれていますが、これをクリックすると(ナビゲートするのではなく)機能を実行したいのですが、重要なのは、親の<ul>に含まれるリンクでのみ起こり、ネストされた<ul>のリンクはありません。jQueryセレクタがリスト要素内のすべてのアンカーを選択するのはなぜですか?

HTML::

<ul> 
    <li> 
     <a href="dontleavethis.page">A link</a> 
     <ul> 
      <li><a href="navigate.there">A nested link</a></li> 
      <li><a href="navigate.somewhere">Another nested link</a></li> 
     </ul> 
    </li> 
</ul> 

のjQuery:

$('li:has(ul) a').click(function() { 
    bla bla bla... 
    return false; 
}); 

事が、どんなに私フレーズ私のセレクタ、私はトリガーから、ネストされた<ul>内のリンクを止めることはできませんされ、簡単なあなたは思うだろうクリックハンドラそれらは明らかにセレクタの":has(ul)"基準に一致しませんが、何らかの理由でハンドラがまだ接続されています。私はここで間違って何をしていますか?

答えて

6
$('li:has(ul) > a').click(...) 

あなたの問題は$('li:has(ul) a')lihasそのul、だけでなく、直接の子の内側すべてaの要素を意味していることです。

+0

ああ、それは理にかなっています!ありがとう! –

1
$('ul > li:has(ul) > a').click(function(){ 
    bla bla bla.... 
    return false; 
}); 
+0

申し訳ありませんが、サイコロ。私はこれとまったく同じ振る舞いをします。とにかくありがとう! –

+0

ええと、これはあなたが受け入れた答えとまったく同じものです...それだけでは、そこにもulがあります(何も変わらないでしょう)。 – idrumgood

0

トップレベルのリンクにクラスを与えると、複雑な(ish)セレクタロジックを必要とせずに直接アクセスできます。

+0

これは、リンクごとにクラスが挿入され、HTMLを混乱させ、不確定な帯域幅を生成することを意味します。親クラスにクラス/ IDを与え、直接祖先だけを選択すると、より効率的です –

+0

しかし、提供されている他のセレクタはDOM構造に依存しているため、問題が進む可能性があります。クラスは説明的なセレクタも提供し、コードをより読みやすくします。 – daddywoodland

0

あなたはメインのulにIDを渡すべきです、私は "メイン"を使用しますが、あなた自身の利益のために、より記述的なものを考えてみるべきです。次に、あなただけの要素の唯一の直接の祖先を選択します

$('ul#main > li > a').click(function() { 
    bla bla bla... 
    return false; 
}); 

>を使用することができます。

-edit- これはulがないと李がスタイルを持つことを意味しません。 @ idrumgoodのソリューションが最適です。

+0

もちろん、それはもちろん動作します。 IDまたはクラスを割り当てなくても、IDまたはクラス(リストの親要素には既にIDが割り当てられています)を使わずに、それを行うためのきちんとした方法があることを期待していました。 –

0

イベントが伝播する可能性がありますか?

方法について

$('ul > li:has(ul) > a').click(function(event){ 
    bla bla bla.... 
    event.stopPropagation(); 
    return false; 
});