2011-12-23 34 views
8

que estoy usando onClick en filas de la tabla de la siguiente manera:usando onClick en una fila de la tabla que también tiene enlaces en el mismo

<tr onmouseover="this.style.cursor='pointer'" onclick="http://www.whatever.com/index.php?var={$foo1}"> 

También tienen algunas necesidades para poner un enlace en ciertas áreas en esta fila de la tabla, es decir

<td>Stuff Here</td> 
<td>Stuff Here</td> 
<td>Stuff Here</td> 
<td><a href="specialLink.php?var={$foo2}">Here</a></td> 
<td>Stuff Here</td> 

el problema es, el "eslabón interior" (specialLink.php) no se puede hacer clic, porque el enlace fila tiene prioridad. ¿Tengo alguna opción aquí?

Gracias

Respuesta

6

Haré lo que:

<script type="text/javascript"> 
var link=true; 
</script> 

<tr onmouseover="this.style.cursor='pointer'" onclick="if (link) window.location ='http://www.whatever.com'"> 

<td>Stuff Here</td> 
<td>Stuff Here</td> 
<td>Stuff Here</td> 
<td onmouseover="link=false;" onmouseout="link=true;"><a href="specialLink.php">Here</a></td> 
<td>Stuff Here</td> 
+0

usando esto, cuando hago clic en el enlace noth sucede. Si hago clic en otras celdas de esa fila, irá correctamente al enlace principal. Si hago clic con la rueda del mouse (abrir en una pestaña nueva), se abrirá el enlace correcto en la pestaña. ¿Alguna otra idea? – Shackrock

+0

¿Qué navegador estás usando? Funciona bien para mí con FF e IE – Kevin

+0

Sí, tienes razón, tuve un error tipográfico. Gracias hombre. – Shackrock

5

También puede hacer esto (y esto utiliza jQuery):

$("td") 
    .click(function(e){ 
     var tag = e.target.nodeName; 
     if(tag === 'A'){ 
      // link was clicked 
     } else { 
      // normal td was clicked 
     } 
    }); 

Example.

Esto reemplaza la necesidad de usar Javascript en línea.

+0

El problema con esto es que solo puedo tener un enlace. Tengo cientos de filas de datos y cada uno tiene un enlace diferente (analizado por PHP antes de que llegue aquí) ... – Shackrock

+0

¿Dice que puede tener un enlace, pero luego dice que tiene cientos de ellos ...? – Purag

+0

Sí, tal vez debería haber sido más claro ... Lo actualicé (uso Smarty, como verá). Cada FILA tiene un valor diferente para $ foo1 y $ foo2 – Shackrock

1

Intente poner un id en la celda de la tabla y use jQuery para manejar el evento click. Por ejemplo ...

<tr id="row1"> 
    <td id="cell1" class="table_cell">etc</td> 
    <td id="cell2" class="table_cell">etc</td> 
</tr> 

Su código de jQuery puede la trampa cada clic a través de la clase de la celda de la tabla de la siguiente manera ...

$(".table_cell").click(function(){ 
    // Activated by a click on any table cell with the class "table_cell" 
    var cell_id = $(this).attr("id"); // Loads id of td element clicked on 
    // Insert code that deals with a click on that specific table cell here... 
}); 

Incluso podría intentar poner la URL en una etiqueta del título, recuperar de la misma manera que recupero el ID anterior, eliminando así un montón de javascript desordenado y código if/then.

Usando jQuery's .hover() también puede reemplazar onmouseover y onmouseout out con una sola función jQuery. Esto da como resultado un código que es más corto, más limpio y puede colocarse en un archivo .js externo para facilitar su uso en cualquier página que lo necesite.

2

De hecho, pondría un evento en toda la mesa, no en cada fila. Especialmente si tienes cientos. Así que ...

<table id="links" style="cursor: pointer;"> 
    <tr data-var="{$foo1}"> 
     <td><a href="http://example.com/">Link</a></td> 
     <td>Another cell</td> 
    </tr> 
</table> 
<script type="text/javascript"> 
    document.getElementById('links').onclick = function(e) { 
     e = e || window.event; 
     var t = e.srcElement || e.target; 
     if(!t.tagName) t = t.parentNode; // some browsers treat text nodes as potential targets 
     while(t != this) { 
      if(t.tagName == "A") break; 
      if(t.getAttribute("data-var")) 
       location.href = "http://example.com/index.php?var="+t.getAttribute("data-var"); 
     } 
    }; 
</script> 

Este método no contamina el ámbito global, y utiliza un solo evento que siempre es más eficiente que una por fila.

7

Puede usar stopImmediatePropagation() para eludir eventos consecutivos/entrantes.

ejemplo corto:

<tr onclick="alert('tr event')"> 
    <td>tr event</td> 
    <td onclick="alert('td');event.stopImmediatePropagation();">NO tr event</td> 
</tr> 

Prueba esto en jsFiddle: http://jsfiddle.net/g8Anh/6/

+0

Importante: al usar una función para controlar eventos, DEBE pasar el objeto [event] –

+0

Esto funcionó para mí. Si haces javascript en línea, no tienes que pasar nada. Simplemente usa el método anterior. – bean5

+1

Esto solo funciona en IE> = 9. Para la mayoría de las versiones "event.cancelBubble = true;" trabajos. – LiquidityC

1

en el elemento td rodea su enlace puso el siguiente attr:

<td onclick="event.cancelBubble=true;">your link with event</td> 

Ésta es la forma en que resolvemos para IE en mi trabajo

+0

Esto funcionó para mí en Firefox, Chrome y Edge. ¡Gracias! –

Cuestiones relacionadas