2011-01-10 17 views
0

子要素のリンクがクリックされたときにイベントをキャプチャし、 "highlightchild"というクラスを追加しようとしています。また、子要素のリンクが存在しないかどうかをチェックしたい場合は、子要素が存在しない場合、つまり、親の「highlightparent」を持つ「第3レベル」のハイライトが必要です。 jqueryを使ってどうすればいいですか?jqueryを使用してクリックした子リンクをキャプチャする方法は?

$(document).ready(function() { 
    $('.menu ul').hide(); 
    $('.menu .arrowUp').click(function() { 
    $('.menu ul').hide(); 
    $(this).find(".third-level").toggle(); 
    }); 
}); 

HTML

<ul class="menu"> 
<li class="arrowUp"><a href="#">link1</a> 
<ul class="third-level" >    
<!-- third level non-active --> 
    <li class="arrowUp"><a href="/somelink/">Some Link</a></li> 
</ul> 
</li> 
<li class="arrowUp"><a href="#">link2</a> 
<ul class="third-level" >    
<!-- third level non-active --> 
    <li class="arrowUp"><a href="/links2/">some Links 2</a></li> 
</ul> 
</li> 
<li class="arrowUp"><a href="#">link3</a> 
<ul class="third-level" > 
<!-- third level non-active --> 
    <li class="arrowUp"><a href="/Agri/">Agricultural</a></li> 
    <!-- third level non-active --> 
     <li class="arrowUp"><a href="/sugar/">Sugar</a></li> 
    <!-- third level non-active --> 
     <li class="arrowUp"><a href="/bbc/">Coffee</a></li> 
     <!-- third level non-active --> 
     <li class="arrowUp"><a href="/cnn/">Energy</a></li> 
     <!-- third level non-active --> 
     <li class="arrowUp"><a href="funstuff">Fun stuff</a></li> 
    </ul> 
</li> 
<li class="arrowUp"><a href="#">link4</a></li> 
<li class="arrowUp"><a href="#">link5</a></li> 
<li class="arrowUp"><a href="#">link6</a></li> 
</ul> 

答えて

0
// add hightlightChild class to children anchor tags on click 
$('.parent_link > a').click(function(){ 
    $(this).addClass('highlightChild'); 
    return false; // or not if you want to follow the link 
}); 

// loop over each parent link and highlight it if no children links exist 
$('.parent_link').each(function(){ 
    if ($(this).children('a').size() > 0){ 
    $(this).addClass('highlightParent'); 
    } 
}); 
0

方法について:

$(".arrowUp > a").bind("click", function(event) { 
    event.preventDefault(); 
    if ($(this).closest(".third-level").length > 0 || 
     $(this).siblings().length === 0) { 
     $(this).addClass("highlight"); 
    } 
}); 

ノー兄弟a sのクラスthird-level、またはリンクを持つ親を持つすべてのリンク。

http://jsfiddle.net/andrewwhitaker/bMupR/

編集:は、ここにあなたがそれを行うだろうかだ、あなたは別の親/子ハイライトクラスを望んでいた気付かなかった:あなたが何を意味するのか

$(".arrowUp > a").bind("click", function(event) { 
    event.preventDefault(); 
    if ($(this).closest(".third-level").length > 0) { 
     $(this).addClass("childhighlight"); 
    } 
    else if ($(this).siblings().length === 0) { 
     $(this).addClass("parenthighlight"); 
    } 
}); 

http://jsfiddle.net/andrewwhitaker/bMupR/1/

2

わかりませんあなたの2番目の部分(それを言い換えたり、明確にすることはできますか?)を使用しますが、私は.delegate()を使用します:

$('ul.menu').delegate('a', 'click', function() { 
    $('ul.menu .highlightchild').removeClass('.highlightchild'); 
    $(this).addClass('.highlightchild'); 
}); 

これは、イベントハンドラのみをメニューのルートに追加します。

+0

これは、すべてのノードにリスナーを追加するよりも良い方法だと思います。私の唯一の提案は、クエリ、削除、追加の代わりに$(this).hasClass( ".highlightchild")のチェックを行うことができるということです。 – Newtang

+0

@Newtang:以前にクリックされた要素からクラスを削除します。 '$(this).hasClass(" .highlightchild ")'は、その要素が以前にクリックされたものかどうかを見るのに役立ちます。私の解決策が適合するかどうかは、OPが何を達成したいと思っているのかは分かりません。しかし、イベントの委任は、何千ものイベントハンドラを追加するよりも好ましいはずです –

関連する問題