Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: JonaLamper en 24 Enero 2017, 13:17 pm



Título: Hacer que un <tr> sea un link
Publicado por: JonaLamper en 24 Enero 2017, 13:17 pm
Buenas,

Digamos que tengo una tabla que se rellena dinámicamente con jQuery al realizar una petición al servidor y quiero que cada fila de la tabla sea un enlace (para que al pulsarlo me aparezcan más detalles sobre ese resultado).

¿Alguien sabe cómo podría hacer que una fila de una tabla sea un link?


Muchas gracias!  ;D


Título: Re: Hacer que un <tr> sea un link
Publicado por: z3nth10n en 24 Enero 2017, 13:22 pm
Buenas JonaLamper,

mmm... <tr> es la fila (es decir, el conjunto de celdas), te referiras a cada celda, si es así con añadir un input o un <a>, eso, si acuerdate de anular el evento del a, poniendo al final un return false...

De otra forma, no se a que te refieres, si puedes ejemplificar con images o codigo que ya tengas sería de utilidad :P

Un saludo.


Título: Re: Hacer que un <tr> sea un link
Publicado por: #!drvy en 24 Enero 2017, 13:31 pm
Si usas jQuery puedes usar el listener onClick.

Código
  1.    <tr class='showData' data-href='pagina1'>
  2.        <td>...</td>
  3.        <td>...</td>
  4.        <td>...</td>
  5.    </tr>
  6.  
  7.    <tr class='showData' data-href='pagina2'>
  8.        <td>...</td>
  9.        <td>...</td>
  10.        <td>...</td>
  11.    </tr>

Código
  1. $(function(){
  2.  
  3.  $('body').on('click', '.showData', function(event){
  4.  
  5.    event.preventDefault();
  6.    alert( $(this).data('href') );
  7.  
  8.  });
  9.  
  10. });
  11.  

PD: Nota como el listener (on), actual sobre body es el que busca .showData.. si se hace directamente ($('.showData').on..)) no te dispararía el evento en DOM añadido después de la carga inicial (ajax por ejemplo).

Saludos


Título: Re: Hacer que un <tr> sea un link
Publicado por: JonaLamper en 24 Enero 2017, 16:55 pm
Muchísimas gracias. Al final lo he conseguido de otra forma (ahora después lo pongo). Es que al final no hacia falta hacer que el <tr> fuese un link.


Otra pregunta: digamos que tengo una tabla que se rellena de forma dinámica con jQuery.

Código
  1.                    var fila = $("<tr id="+ curso.titulo +">");
  2.                      // Añadimos el texto obtenido de la base de datos
  3.                    fila.append($("<td>").text(curso.titulo));
  4.                    fila.append($("<td>").text(curso.localidad));
  5.                    fila.append($("<td>").text(curso.fecha_inicio));
  6.                    fila.append($("<td>").text(curso.fecha_fin));
  7.                    fila.append($("<td>").text(curso.plazas_disponibles));
  8.                    // Añadimos la fila al cuerpo de la tabla
  9.                    $("#tabla_cursos tbody").append(fila);

Digamos que es una tabla de cursos escolares, por ejemplo. Como vemos, cada <tr> se genera metiendo un id (que es el título del curso). Ahora, lo que pretendo es que, al pulsar en una fila, se ejecuta una determinada acción. Así que he pensado en obtener el id del <tr> sobre el que se pulse. Pero... no lo consigo. En primer lugar he probado a que me muestre por consola un mensaje cuando se pulse dentro de un <td>, y ni siquiera eso soy capaz de hacer.

Código
  1.  
  2.    $("td").on("click",function(){
  3.        console.log("Se ha pulsado en un td");
  4.    });
  5.  

La verdad es que no entiendo porqué este último código no me funciona, si es súper simple xD

Os dejo una foto para que os hagáis una idea de cómo es la tabla:

(http://thumbs.subefotos.com/0f26a8bf6280f30cb12b51e2cd5122c7o.jpg) (http://subefotos.com/ver/?0f26a8bf6280f30cb12b51e2cd5122c7o.jpg)

¿Alguien sabe cómo podría hacer todo esto?

Gracias de nuevo  :D


Título: Re: Hacer que un <tr> sea un link
Publicado por: #!drvy en 24 Enero 2017, 17:47 pm
El problema, como ya te comente de forma muy mal escrita xD, es que el DOM agregado después de la carga inicial hay que capturarlo desde un elemento que si se haya cargado al principio.

Es decir:
Código
  1. $('#tabla_cursos').on('click', 'td', function(event){
  2.    var currentID = $(this).parent('tr').attr('id'); // Id del <tr>
  3.  
  4.    console.log('Se ha pulsado en un td');
  5.    console.log('El elemento pulsado tiene de id: ' + currentID);
  6. });

Eso suponiendo que #tabla_cursos la generas antes de la precarga.

Saludos


Título: Re: Hacer que un <tr> sea un link
Publicado por: JonaLamper en 24 Enero 2017, 17:52 pm
Oh! Muchas gracias, ya funciona.

Vaya, no tenía ni idea de eso (y tiene muchas consecuencias xD).

Sí, las etiquetas table son estáticas en el HTML  ;D


Título: Re: Hacer que un <tr> sea un link
Publicado por: JonaLamper en 24 Enero 2017, 21:01 pm
Hola de nuevo  ;D

Me ha surgido un problemilla... Si el id estuviera compuesto por una cadena del tipo "Mi nombre", sólo coge "Mi" como parte del id. ¿Sabéis como podría hacer que cogiese toda la cadena?


¡Gracias!


Título: Re: Hacer que un <tr> sea un link
Publicado por: #!drvy en 24 Enero 2017, 22:40 pm
Hola,

El problema con los id con espacio es que van en contra de las normas. Ni HTML4 ni HTML5 los permiten. De hecho HTML5 quitó bastantes restricciones pero mantuvo esa. Y es bastante razonable teniendo en cuenta que esta pensado para ser usado como una propiedad vía javascript.

De todos modos, haciendo pruebas veo que el attr() de jQuery si lo recoge (con espacios), al menos en Chrome.

Siempre puedes reemplazar los espacios por guiones a la hora de suministrar el id.. pero vamos.. para almacenar información compleja lo que te recomendaría es usar los atributos data-*.

Código
  1.    <tr data-curso='Batch en Linux 101' id='curso1'>
  2.        <td>...</td> <td>...</td>  <td>...</td>
  3.    </tr>
  4.  
  5.    <tr data-curso='Cocinar huevos para dummies' id='curso2'>
  6.        <td>...</td> <td>...</td>  <td>...</td>
  7.    </tr>


Código
  1. $('#tabla_cursos').on('click', 'td', function(event){
  2.    var _parent = $(this).parent('tr');
  3.  
  4.    var cursoID = _parent.attr('id');
  5.    var cursoTitulo = _parent.data('curso');
  6.  
  7.    console.log(cursoID + ' Titulo: ' + cursoTitulo);
  8. });

Saludos