2009-05-18 15 views
12

Sto riscontrando alcuni problemi con qualche codice jQuery e spero e penso che la soluzione sia relativamente semplice.Fare clic sull'evento nella riga della tabella - attivare solo se non si fa clic su null'altro

dire che ho un tavolo come:

<table> 
    <tr> 
    <td><input type="checkbox" name="hai" value="der" /></td> 
    <td><a href="mypage.php">My link</a></td> 
    <td>Some data</td> 
    <td>Some more data</td> 
    </tr> 
    ... 
</table> 

Ora tramite JavaScript faccio il .ready seguente in jQuery (document)();

jQuery("table tr").click(function(){ 
    var row = jQuery(this); 
    var hasClass = row.hasClass("highlight"); 
    jQuery("table tr").removeClass("highlight"); 
    if(!hasClass){ 
    row.addClass("highlight"); 
    } 
}); 

Tutto questo è roba abbastanza semplice - voglio essere in grado di fare clic su una riga e farlo Essere evidenziato e solo una riga può essere evidenziato in un momento (ovviamente nel mio codice vero e faccio più di quello) - ora ecco il mio problema:

Quando un utente fa clic sul tag di ancoraggio o sulle caselle di controllo, ciò attiva anche l'evento click di riga e non riesco a capire come filtrarlo? So che ho bisogno di includere l'evento nel mio gestore di clic, ma come verificarlo in modo tale che funzioni nel maggior numero di browser possibile?

risposta

15

Prova ad aggiungere gestori agli altri elementi che rispondono agli eventi di clic e interrompi l'evento. Questo sarebbe in aggiunta a quello che hai già.

jQuery('table input, table a').click(function(e) { 
    e.stopPropagation(); 
    return true; 
}): 
+0

Si può spiegare che cosa questo significa in realtà? – darkapple

+2

Gli eventi di @darkapple vengono visualizzati tramite il DOM per i gestori di elementi di livello superiore. Fermando la propagazione, diciamo al browser di non passare l'evento a quegli elementi e quindi i loro gestori non saranno mai invocati. Restituire true consente all'azione predefinita per l'elemento di continuare (ad es. Il link da portare a una nuova pagina). Quindi, in questo caso, non invochiamo il gestore che non evidenzia la riga evidenziata se viene fatto clic sul link o sulla casella di controllo, ma è se è presente qualcos'altro nella riga. – tvanfosson

+0

grazie per la clearification. Ero curioso di sapere a cosa servisse il ritorno vero. – darkapple

1
$("table tr").click(function(e){ 

if (e.target instanceof HTMLInputElement || e.target instanceof HTMLAnchorElement){ 
return; 
} 
var row=$(this); 
$('table tr').removeClass('highlight'); 
row.addClass('highlight','normal'); 

}) 
3
$("table tr").click(function(event){ 
    if (event.currentTarget.tagName != "TR") { return; } 

    $(this).closest("table").find("tr.highlight").removeClass("highlight"); 
    $(this).addClass("highlight"); 
}); 
Problemi correlati