2009-05-18 14 views
12

Tengo algunos problemas con algún código jQuery, y estoy esperando y pensando que la solución es relativamente simple.Haga clic en el evento en la fila de la tabla: solo se activa si no se hace clic en 'más'

Decir que tengo una tabla como:

<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> 

Ahora a través de JavaScript que hacer lo siguiente en jQuery ready (documento)();

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

Todo esto es algo bastante sencillo - Quiero ser capaz de hacer clic una fila y lo han de ser resaltado y sólo una fila se pueden destacar a la vez (obviamente, en mi código real que hago más que eso) - ahora aquí está mi problema:

Cuando un usuario hace clic en la etiqueta de anclaje, o las casillas de verificación, esto desencadena el evento de clic de fila también y no puedo averiguar cómo filtrarlo? Sé que necesito incluir el evento en mi controlador de clics, pero ¿cómo verificarlo de tal manera que funcione en tantos navegadores como sea posible?

Respuesta

15

Pruebe agregar manejadores a los otros elementos que responden a los eventos de clic y evitar que el evento burbujee. Esto sería adicional a lo que ya tienes.

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

puede usted explicar lo que esto significa en realidad? – darkapple

+2

@darkapple eventos brotan a través del DOM a los controladores en elementos de nivel superior. Al detener la propagación, le decimos al navegador que no pase el evento a esos elementos y, por lo tanto, sus manejadores nunca serán invocados. Devolver verdadero permite que la acción predeterminada para el elemento continúe (por ejemplo, el enlace se transfiere a una página nueva). Entonces, en este caso, no invocamos el manejador que hace que el resaltado de la fila no se invoque si se hace clic en el enlace o en la casilla de verificación, sino si hay algo más en la fila. – tvanfosson

+0

gracias por la aclaración. Me preguntaba cuál era el uso del retorno verdadero. – 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"); 
}); 
Cuestiones relacionadas