2012-04-14 11 views
1

Ich habe einen Link, den ich deaktivieren möchte. Problem ist, dass es in einer li ist, die eine Unterliste hat, so dass es auch diese Links deaktiviert. Der HTML-Code sieht im Grunde wie folgt:JQuery prevendDefault [einen Link deaktivieren] in einer Liste, aber nicht in einer untergeordneten Liste

<div id="main"> 
<ul class="index"><li class="firstLI"><a href="some other URL"></a></li> 

<li class="secondLI"><a href="disableMe">Disable this Link</a> 
    <ul> 
     <li><a href="dontDisableMe">Don't Disable Me</a></li> 
     <li><a href="dontDisableMe">Don't Disable Me</a></li> 
    </ul> 
</li> 
<li>third</li></ul> 
</div> 

ich das ‚a‘ innerhalb des ‚li‘ Klasse secondLI aber nicht alle der zugehörigen UL Kinder deaktivieren möchten.

Ich habe versucht:

function preventDefault(e) { 
     e.preventDefault()}; 

    $("#main li:nth-child(2) a").bind("click", preventDefault); 

    $(".secondLI").unbind("click", prevenDefault); 

und

$("#main li:nth-child(2) a").click(function(e) { 
    e.preventDefault(); 
    //do other stuff when a click happens 
}); 

Antwort

4

die > selector verwenden, die nur die direkten Kinder auswählt.

$("#main li:nth-child(4) > a").click(function(e) { ... 

Alternativ, wenn nur ein Link vorhanden ist, verwenden Sie :first selector.

Oder noch besser, geben Sie dem Link eine Klasse oder ID, wenn Sie können und wählen Sie es direkt aus.

+0

Ausgezeichnet! Ich benutzte den ersten Weg (mit dem> Selektor) und das tat es. Ich habe auch die zweite versucht und es hat nicht funktioniert. Vielen Dank! – user1332983

0

Click events bubble: zuerst wird der Click-Handler des li-Elements ausgelöst (wenn es einen gibt), dann der Click-Handler des Elterns, dann der des Elterns des Elternteils und so weiter. Jeder Handler in dieser Kette kann die Standardaktion abbrechen. Wenn Sie also einen Event-Handler im li li ohne preventDefault (oder gar keinen Event-Handler) und einen Event-Handler auf dem Eltern li mit preventDefault haben, dann wird die Standardaktion verhindert.

Zwei einfache Möglichkeiten, um diesen:

  • im Ereignishandler der äußeren li, überprüfen Sie das Ziel des Klicks (e.target) und nur preventDefault berufen, wenn es nicht innerhalb des Kindes ist ul;
  • im Ereignishandler der inneren li, sprudeln (e.stopPropagation); Auf diese Weise wird der Ereignishandler des übergeordneten Elements li überhaupt nicht aufgerufen.
+0

Oder wenn Ihr Event-Handler nur Klicks auf die Links behandeln soll, können Sie sie direkt auf die "a" -Tags setzen, die nicht verschachtelt sind. – Tgr