come rendere selezionabile un'intera riga in una tabella come collegamento?


438

Sto usando Bootstrap e il seguente non funziona:

<tbody>
    <a href="#">
        <tr>
            <td>Blah Blah</td>
            <td>1234567</td>
            <td>£158,000</td>
        </tr>
    </a>
</tbody>

2
JavaScript potrebbe essere migliore per questo
John Conde,

1
Sta usando il bootstrap quindi penso che dovrebbe essere in grado di farlo :)
Ahmed Masud,

Che ne dici di mettere un elemento A trasparente prima della riga? In questo modo avrebbe tutte le proprietà di un collegamento reale (barra di stato, clic centrale ecc ...) e non cambierebbe l'aspetto della tabella (se lo si desidera).
David Balažic,


Risposte:


568

Nota dell'autore I:

Si prega di guardare altre risposte di seguito, in particolare quelle che non usano jquery.

Nota dell'autore II:

Conservato per i posteri, ma sicuramente l' approccio sbagliato nel 2020. (Era non idiomatico anche nel 2017)

Risposta originale

Stai usando Bootstrap, il che significa che stai usando jQuery: ^), quindi un modo per farlo è:

<tbody>
    <tr class='clickable-row' data-href='url://'>
        <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
    </tr>
</tbody>


jQuery(document).ready(function($) {
    $(".clickable-row").click(function() {
        window.location = $(this).data("href");
    });
});

Ovviamente non devi usare href o cambiare posizione, puoi fare quello che vuoi nella funzione del gestore di clic. Continua a leggere jQuerye come scrivere i gestori;

Il vantaggio di utilizzare una classe su ID è che puoi applicare la soluzione a più righe:

<tbody>
    <tr class='clickable-row' data-href='url://link-for-first-row/'>
        <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
    </tr>
    <tr class='clickable-row' data-href='url://some-other-link/'>
        <td>More money</td> <td>1234567</td> <td>£800,000</td>
    </tr>
</tbody>

e la tua base di codice non cambia. Lo stesso gestore si occuperebbe di tutte le file.

Un'altra opzione

È possibile utilizzare i callback Bootstrap jQuery in questo modo (in un document.readycallback):

$("#container").on('click-row.bs.table', function (e, row, $element) {
    window.location = $element.data('href');
});

Ciò ha il vantaggio di non essere ripristinato al momento dell'ordinamento delle tabelle (cosa che accade con l'altra opzione).


Nota

Poiché questo è stato pubblicato window.document.locationè invece obsoleto (o almeno deprecato) window.location.


105
Puoi anche cambiare il cursore con css: tr.clickableRow {pointer: pointer; }
Winston Kotzan,

78
Volevo solo aggiungere che non dovresti usare l' hrefattributo su a tr, poiché non è un attributo valido per questo elemento. Usa invece gli attributi dei dati: data-url="{linkurl}"e nel codice js:$(this).data('url')
Maksim Vi.

12
Puoi evitare di usare una classe su ogni riga e decorare la tabella con un nome di classe di clickable_row(CamelCase è contro gli standard HTML e dovrebbe essere minuscolo (ho avuto problemi con il browser un paio di volte con questo)) e poi il jQuery è $('.clickable_row tr').click(function ...Ma in realtà dovresti usare data-per conservare i dati, invece hrefche dal momento che è la specifica per i dati personalizzati. data-urle jquery vi accederà come$(this).data(url);
Piotr Kula

3
Cordiali saluti: Se puoi, dovresti lasciare un link da qualche parte nel tr per le persone che hanno Javascript disabilitato.
hitautodestruct

47
Non è un grande fan di questa soluzione perché gli utenti non vedono l'URL del link nella parte inferiore del browser durante il passaggio del mouse e, cosa più importante, non possono fare clic sul collegamento per aprirlo in una nuova scheda. Inserire un atag display: block;all'interno di ogni cella è un po 'fastidioso, ma sembra il modo più utilizzabile per risolvere questo problema.
Maxime Rossini,

222

Non puoi farlo. È HTML non valido. Non puoi inserire un intervallo <a>tra a <tbody>e a <tr>. Prova questo invece:

<tr onclick="window.location='#';">
        ...
     </tr>

aggiungi stile per la vista del puntatore

[data-href] { cursor: pointer; }

Quando si lavora su di esso, si desidera utilizzare JavaScript per assegnare il gestore di clic al di fuori dell'HTML.


3
@Aquillo l'OP afferma specificamente che sta usando bootstrap. quindi una soluzione jQuery sarebbe migliore nel quadro
Ahmed Masud,

39
@AhmedMasud In questo caso, sì. Anche se per qualsiasi futuro lettore, JS potrebbe essere una soluzione migliore. Poiché questo è lo scopo di Stackoverflow, considero ancora valido il mio commento.
Menno,

3
La separazione tra comportamento e markup è sicuramente da preferire. Semmai direi che href non è un attributo valido su un tr. Dovrebbe essere sostituito con un data-href e sostituire $ (questo) .attr con $ (questo) .data.
davidfurber,

1
Oppure potresti fare in modo che l'approccio di associazione di eventi di classe ".clickableRow" cerchi il primo <a>all'interno della riga selezionata. (che si degraderebbe anche con grazia)
Jason Sperske,

3
Se si utilizza la sintassi ES6, è possibile eseguire il collegamento facendo clic in questo modo:onClick={() => window.open('https://stackoverflow.com/', '_blank')}
Louie Bertoncin

186

Puoi includere un'ancora all'interno di ogni <td>, in questo modo:

<tr>
  <td><a href="#">Blah Blah</a></td>
  <td><a href="#">1234567</a></td>
  <td><a href="#">more text</a></td>
</tr>

È quindi possibile utilizzare display:block;gli ancoraggi per rendere selezionabile l'intera riga.

tr:hover { 
   background: red; 
}
td a { 
   display: block; 
   border: 1px solid black;
   padding: 16px; 
}

Esempio jsFiddle qui.

Questo è probabilmente ottimale quanto lo otterrai a meno che non ricorra a JavaScript.


11
Questa è la soluzione migliore, no jquery no javascript solo CSS, cioè il mio link potrebbe essere diverso non href, con parametri multipli come <a4j: commandLink /> quindi lo tengo e cambio solo lo stile. Grazie molto.
TiyebM,

4
@daniel buona risposta ma se la cella si estende verso il basso, non funziona correttamente come questo jsfiddle.net/RFFy9/253
midstack

4
Grande! Questa soluzione consente di aprire il collegamento in una nuova scheda se l'utente lo desidera. Ma le colonne vuote non avranno collegamenti.
Ignacio Pérez,

9
@AnnaRouben Non dovrò essere d'accordo: avere più collegamenti simili è un rovescio della medaglia molto piccolo rispetto agli aspetti positivi (funziona senza JS, l'utilità per la lettura dello schermo può leggere dove conduce il collegamento, può fare clic tenendo premuto il tasto Ctrl per aprire in una nuova scheda. ..) Le soluzioni Pure-HTML funzionano quasi sempre meglio nei software assistivi rispetto alle soluzioni JS.
JJJ,

6
Mi piace questa soluzione per la sua accessibilità. Gli utenti possono scorrere i collegamenti, inoltre è possibile aprire i collegamenti in nuove schede. Quello che ho fatto nella mia app è messo tabindex="-1"su tutto tranne il primo <td>link, quindi le schede utente riga per riga, non cella a cella. Inoltre, puoi comunque evidenziare / delineare l'intera riga se desideri utilizzare la :focus-withinpseudo-classe CSS.
Jonathan,

90

Una riga di tabella collegata è possibile, ma non con gli <table>elementi standard . Puoi farlo usando le display: tableproprietà dello stile. Qui e qui ci sono alcuni violini da dimostrare.

Questo codice dovrebbe fare il trucco:

.table {
  display: table;
}

.row {
  display: table-row;
}

.cell {
  display: table-cell;
  padding: 10px;
}

.row:hover {
  background-color: #cccccc;
}

.cell:hover {
  background-color: #e5e5e5;
}
<link href="https://stackpath.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" type="text/css" />

<div role="grid" class="table">
  <div role="row" class="row">
    <div role="gridcell" class="cell">
      1.1
    </div>
    <div role="gridcell" class="cell">
      1.2
    </div>
    <div role="gridcell" class="cell">
      1.3
    </div>
  </div>

  <a role="row" class="row" href="#">
    <div role="gridcell" class="cell">
      2.1
    </div>
    <div role="gridcell" class="cell">
      2.2
    </div>
    <div role="gridcell" class="cell">
      2.3
    </div>
  </a>
</div>

Si noti che i ruoli ARIA sono necessari per garantire la corretta accessibilità poiché gli <table>elementi standard non vengono utilizzati. Potrebbe essere necessario aggiungere ruoli aggiuntivi come role="columnheader"se applicabile. Scopri di più sulla guida qui.


13
Ora prova ad applicare il plug-in dataTables a questo! :)
Afonso Gomes,

7
Questa è la risposta corretta IMHO, perché conserva tutti gli strumenti dell'agente utente relativi ai collegamenti: ricerca (es. /Chiave in Firefox), navigazione ( tabchiave), Copia posizione collegamento, Apri in una nuova scheda / finestra, ecc. Anche per accessi / speciali ha bisogno di browser. Il mio unico pignolo è che non farei un nido <div>all'interno <a>, quindi le celle sarebbero meglio contrassegnate come <span>.
Tobia,

L'applicazione di plugin e librerie di terze parti a tali tabelle CSS potrebbe comportare un po 'più di lavoro, ma di solito è copia-incolla e sostituisci. Ad esempio, ho appena duplicato il Bootstrap _tables.scsse alcuni altri pezzi casuali, sostituendo tutte le occorrenze degli elementi della tabella con le classi CSS che ho scelto di utilizzare (che sono semplicemente gli stessi degli elementi: th.th) Non molto lavoro rispetto ai vantaggi, davvero .
Tobia,

2
Bella risposta, ma questa è una soluzione solo se la tabella è stata appena utilizzata per un corretto allineamento (come in molte situazioni!). Per i dati tabulari, la semantica <table>è lì per un motivo. Ma questo batte ancora qualsiasi soluzione javascript :)
Marten Koetsier,

Anche se questa è una soluzione molto intelligente, è proprio questo. In realtà non è una tabella e quindi, come accenna l'autore, presenterà problemi di accessibilità. Molto probabilmente causerà problemi con altre cose che si aspettano un tavolo ma ne stanno ottenendo uno.
Tyson Gibby,

26

Ottenuto usando Bootstrap standard 4.3+ come segue: non sono necessarie jQuery né classi css extra!

La chiave è usare stretched-linkil testo all'interno della cella e definire <tr>come un blocco contenitore.

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"/>

<table class="table table-hover">
  <tbody>
    <tr style="transform: rotate(0);">
    <th scope="row"><a href="#" class="stretched-link">1</a></th>
      <td>Mark</td>
      <td>Otto</td>
      <td>@mdo</td>
    </tr>
    <tr>
      <th scope="row">2</th>
      <td>Jacob</td>
      <td>Thornton</td>
      <td>@fat</td>
    </tr>
    <tr>
      <th scope="row">3</th>
      <td>Larry</td>
      <td>the Bird</td>
      <td>@twitter</td>
    </tr>
  </tbody>
</table>

È possibile definire il blocco di contenimento in diversi modi, ad esempio impostando transformsu nessun valore (come nell'esempio sopra).

Per maggiori informazioni leggi la documentazione di Bootstrap per stretched-link.


1
Questa risposta merita più voto. Nessun javascript. E a cosa serve scope="row"? Non uso l'ambito e la riga si comporta ancora come un collegamento.
Christhofer Natalius,

@ChristhoferNatalius grazie! La mia risposta originale non conteneva il scope="row": controlla la cronologia se desideri vedere cos'altro potrebbe essere stato modificato. Non ho ripristinato le modifiche, tuttavia, poiché lo snippet di codice sembra funzionare (come ha fatto l'originale) e non ho avuto la possibilità di testare il nuovo codice in modo esauriente :-)
Krishna Gupta,

Il rovescio della medaglia di questo è perché il collegamento si troverà in cima alle colonne, non è possibile copiare il testo e il titolo dell'attributo in td non viene visualizzato se passa con il mouse. Quindi, sfortunatamente, devo tornare alla vecchia maniera, mettere il link solo in una colonna.
Christhofer Natalius

3
Mi è piaciuta questa soluzione, ma purtroppo non è cross-browser (Chrome / Firefox sono OK ma non Safari). Il problema è dovuto al trtag che non è riconosciuto come le regole per il blocco che contiene tra i browser ... stackoverflow.com/questions/61342248/...
pom421

Sì, sembra che questo rompa i collegamenti alle tabelle in Safari: il comportamento al passaggio del mouse passa completamente in tilt. Questo commento su # 28608 sembra indicare che non è possibile ottenere il comportamento desiderato sui tavoli con stretched-link.
Jo Liss

17

Una soluzione molto più flessibile è indirizzare qualsiasi cosa con l'attributo data-href. Questo è stato possibile riutilizzare facilmente il codice in luoghi diversi.

<tbody>
    <tr data-href="https://google.com">
        <td>Col 1</td>
        <td>Col 2</td>
    </tr>
</tbody>

Quindi nel tuo jQuery scegli come target qualsiasi elemento con quell'attributo:

jQuery(document).ready(function($) {
    $('*[data-href]').on('click', function() {
        window.location = $(this).data("href");
    });
});

E non dimenticare di dare uno stile al tuo css:

[data-href] {
    cursor: pointer;
}

Ora puoi aggiungere l'attributo data-href a qualsiasi elemento e funzionerà. Quando scrivo frammenti come questo mi piace che siano flessibili. Sentiti libero di aggiungere una soluzione js alla vaniglia se ne hai una.


bel lavoro con il css
Amirhossein Tarmast

La mia soluzione preferita Ben fatto MF
MFrazier

7

È possibile utilizzare questo componente bootstrap:

http://jasny.github.io/bootstrap/javascript/#rowlink

Jasny Bootstrap

I componenti mancanti per il tuo framework front-end preferito.

<table class="table table-striped table-bordered table-hover">
  <thead>
    <tr><th>Name</th><th>Description</th><th>Actions</th></tr>
  </thead>
  <tbody data-link="row" class="rowlink">
    <tr><td><a href="#inputmask">Input mask</a></td><td>Input masks can be used to force the user to enter data conform a specific format.</td><td class="rowlink-skip"><a href="#">Action</a></td></tr>
    <tr><td><a href="http://www.jasny.net/" target="_blank">jasny.net</a></td><td>Shared knowledge of Arnold Daniels aka Jasny.</td><td class="rowlink-skip"><a href="#">Action</a></td></tr>
    <tr><td><a href="#rowlinkModal" data-toggle="modal">Launch modal</a></td><td>Toggle a modal via JavaScript by clicking this row.</td><td class="rowlink-skip"><a href="#">Action</a></td></tr>
  </tbody>
</table>

uso

Tramite attributi di dati

Aggiungi classe .rowlinke attributo data-link="row"a a <table>o <tbody>elemento. Per altre opzioni aggiungi il nome ai dati, come in data-target="a.mainlink"Una cella può essere escluso aggiungendo la .rowlink-skipclasse a<td> .

Tramite JavaScript

Chiama la maschera di input tramite javascript:

$('tbody.rowlink').rowlink()

6

C'è un bel modo di farlo tecnicamente con il <a>tag all'interno <tr>, che potrebbe essere semanticamente errato (potrebbe darti un avviso del browser), ma funzionerà senza JavaScript/jQuerynecessità:

<!-- HTML -->
<tbody>
  <tr class="bs-table-row">
     <td>Blah Blah</td>
     <td>1234567</td>
     <td>£158,000</td>
     <a class="bs-row-link" href="/your-link-here"></a>
  </tr>
</tbody>

/* CSS */
.bs-table-row {
  position: 'relative';
}

.bs-row-link {
  position: 'absolute';
  left: 0;
  height: '36px'; // or different row height based on your requirements
  width: '100%';
  cursor: 'pointer';
}

PS: nota che il trucco qui è mettere il <a>tag come ultimo elemento, altrimenti proverà a occupare lo spazio della prima <td>cella.

PPS: ora sarà possibile fare clic su tutta la riga e puoi utilizzare questo link per aprire anche in una nuova scheda (Ctrl / CMD + clic)


Non è sostanzialmente la stessa della mia risposta ?
David Balažic,

Mentre questa risposta sembra perfetta, in realtà non funziona, perché gli <tr>elementi non possono avere un <a>elemento come bambino. Solo <td>e <th>sono bambini validi. Vedi: stackoverflow.com/questions/12634715/...
funkybunky

5

Puoi usare il metodo javascript onclick in tr e renderlo cliccabile, anche se hai bisogno di costruire il tuo link a causa di alcuni dettagli puoi dichiarare una funzione in javascript e chiamarla in onclick, passando alcuni valori.


5

Ecco un modo mettendo un elemento A trasparente sopra le righe della tabella. I vantaggi sono:

  • è un vero elemento di collegamento: al passaggio del mouse cambia puntatore, mostra il collegamento di destinazione nella barra di stato, può essere navigato da tastiera, può essere aperto in una nuova scheda o finestra, l'URL può essere copiato, ecc.
  • la tabella è identica a quella senza il collegamento aggiunto
  • nessuna modifica nel codice della tabella stessa

svantaggi:

  • la dimensione dell'elemento A deve essere impostata in uno script, sia al momento della creazione sia dopo eventuali modifiche alla dimensione della riga coperta (altrimenti potrebbe essere eseguita senza JavaScript, il che è ancora possibile se è impostata anche la dimensione della tabella in HTML o CSS)

La tabella rimane così com'è:

<table id="tab1">
<tbody>
        <tr>
            <td>Blah Blah</td>
            <td>1234567</td>
            <td>£158,000</td>
        </tr>
</tbody>
</table>

Aggiungi i collegamenti (per ogni riga) tramite JavaScript jQuery inserendo un elemento A in ogni prima colonna e impostando le proprietà necessarie:

// v1, fixed for IE and Chrome
// v0, worked on Firefox only
// width needed for adjusting the width of the A element
var mywidth=$('#tab1').width();

$('#tab1 tbody>tr>td:nth-child(1)').each(function(index){
    $(this).css('position',  'relative');// debug: .css('background-color', '#f11');
    // insert the <A> element
    var myA=$('<A>');
    $(this).append(myA);
    var myheight=$(this).height();

    myA.css({//"border":'1px solid #2dd', border for debug only
            'display': 'block',
            'left': '0',
            'top': '0',
            'position':  'absolute'
        })
        .attr('href','the link here')
        .width(mywidth)
        .height(myheight)
        ;
    });

L'impostazione della larghezza e dell'altezza può essere complicata, se vengono utilizzati molti rilievi e margini, ma in generale alcuni pixel non devono nemmeno importare.

Demo live qui: http://jsfiddle.net/qo0dx0oo/ (funziona con Firefox, ma non con IE o Chrome, il link è posizionato in modo errato)

Risolto per Chrome e IE (funziona ancora anche in FF): http://jsfiddle.net/qo0dx0oo/2/


2
Soluzione intelligente. Ho scoperto che la creazione dell'elemento pigramente, solo una volta che la riga è sospesa, ha portato un enorme aumento delle prestazioni per i grandi tavoli.
levi,

1
@levi puoi dare un feedback su come scaricarlo?
Subliminal Hash,

@KemalEmin Suppongo che userebbe javascriptonmouseover
brad

5

È possibile aggiungere il ruolo del pulsante a una riga della tabella e Bootstrap cambierà il cursore senza alcuna modifica CSS. Ho deciso di utilizzare quel ruolo come modo per rendere facilmente selezionabile qualsiasi riga con pochissimo codice.

html

<table class="table table-striped table-hover">
     <tbody>
          <tr role="button" data-href="#">
               <td>Cell 1</td>
               <td>Cell 2</td>
               <td>Cell 3</td>
          </tr>
     </tbody>
</table>

jQuery

$(function(){
     $(".table").on("click", "tr[role=\"button\"]", function (e) {
          window.location = $(this).data("href");
     });
});

Puoi applicare questo stesso principio per aggiungere il ruolo pulsante a qualsiasi tag.


wow, ha funzionato con ui-sref invece di data-href senza il codice jquery. devi solo cambiare il cursore in dito.
nurp

questo ha funzionato perfettamente grazie mille
Ashish Banerjee

5

Ecco una soluzione semplice ..

<tr style='cursor: pointer; cursor: hand;' onclick="window.location='google.com';"></tr>

4

Questo codice seguente renderà selezionabile l'intera tabella. Facendo clic sui collegamenti in questo esempio verrà mostrato il collegamento in una finestra di avviso invece di seguire il collegamento.

HTML:

Ecco l'HTML dietro l'esempio sopra:

    <table id="example">
    <tr>
     <th>&nbsp;</th>
     <th>Name</th>
     <th>Description</th>
     <th>Price</th>
   </tr>
   <tr>
     <td><a href="apples">Edit</a></td>
     <td>Apples</td>
     <td>Blah blah blah blah</td>
     <td>10.23</td>
   </tr>
    <tr>
     <td><a href="bananas">Edit</a></td>
     <td>Bananas</td>
     <td>Blah blah blah blah</td>
     <td>11.45</td>
   </tr>
   <tr>
     <td><a href="oranges">Edit</a></td>
     <td>Oranges</td>
     <td>Blah blah blah blah</td>
     <td>12.56</td>
   </tr>
    </table>

Il CSS

E il CSS:

    table#example {
    border-collapse: collapse;   
}
#example tr {
    background-color: #eee;
    border-top: 1px solid #fff;
}
#example tr:hover {
    background-color: #ccc;
}
#example th {
    background-color: #fff;
}
#example th, #example td {
    padding: 3px 5px;
}
#example td:hover {
    cursor: pointer;
}

Il jQuery

E infine il jQuery che rende possibile la magia:

    $(document).ready(function() {

    $('#example tr').click(function() {
        var href = $(this).find("a").attr("href");
        if(href) {
            window.location = href;
        }
    });

});

Ciò che fa è quando si fa clic su una riga, viene eseguita una ricerca dell'href appartenente a un'ancora. Se ne viene trovato uno, la posizione della finestra viene impostata su tale href.


4

Un'opzione molto semplice è semplicemente usare con un clic e più corretta, dal mio punto di vista, perché separa la vista e il controller e non è necessario codificare l'URL o qualsiasi altra cosa che si debba fare con il clic . Funziona anche con Angular ng-click.

<table>
  <tr onclick="myFunction(this)">
    <td>Click to show rowIndex</td>
  </tr>
</table>

<script>
function myFunction(x) {
    alert("Row index is: " + x.rowIndex);
}
</script>

Esemplare lavora qui


1
Sicuramente questa è la risposta corretta. Gli altri sono follemente complessi per una cosa così semplice. Se vuoi cambiare il puntatore del mouse puoi aggiungere tr: hover {pointer: pointer; } alla tua lezione CSS
Tom Close

1
@TomClose A seconda di ciò che si desidera che faccia clic sulla riga, ciò può essere problematico, ad esempio la navigazione non funziona normalmente - nessun clic di spostamento per aprire in una nuova scheda / finestra, nessun passaggio del mouse per vedere la destinazione, ecc.
NetMage

3

Un'altra opzione che utilizza un <a>, posizioni CSS e alcuni jQuery o JS :

HTML:

<table>
<tr>
    <td>
        <span>1</span>
        <a href="#" class="rowLink"></a>
    </td>
    <td><span>2</span></td>
</tr>
</table>

CSS:

table tr td:first-child {
    position: relative;
}
a.rowLink {
    position: absolute;
    top: 0; left: 0;
    height: 30px;
}
a.rowLink:hover {
    background-color: #0679a6;
    opacity: 0.1;
}

Quindi devi dare una larghezza, usando ad esempio jQuery:

    $(function () {
        var $table = $('table');
            $links = $table.find('a.rowLink');

        $(window).resize(function () {
            $links.width($table.width());
        });

        $(window).trigger('resize');
    });

3

So che qualcuno ha già scritto più o meno la stessa cosa, tuttavia il mio modo è il modo corretto (div non può essere figlio di A) ed è anche meglio usare le classi.

Puoi imitare una tabella usando CSS e rendere un elemento A la riga

<div class="table" style="width:100%;">
  <a href="#" class="tr">
    <span class="td">
      cell 1
    </span>
    <span class="td">
      cell 2
    </span>
  </a>
</div>

css:

.table{display:table;}
.tr{display:table-row;}
.td{display:table-cell;}
.tr:hover{background-color:#ccc;}

3

Preferirei usare l' onclick=""attributo in quanto è facile da usare e da capire per i neofiti

 <tr onclick="window.location='any-page.php'">
    <td>UserName</td>
    <td>Email</td>
    <td>Address</td>
</tr>

2

La risposta accettata è ottima, ma propongo una piccola alternativa se non vuoi ripetere l'URL su ogni tr. Quindi inserisci l'URL o l'HREF nella tabella data-url e non nel tr.

<table data-click data-url="href://blah">    
    <tbody>
        <tr id ="2">
            <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
        </tr>
        <tr id ="3">
            <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
        </tr>
    </tbody>
    </table

jQuery(document).ready(function($) {
    $('[data-click] tbody tr').click(function() {
        var url = $(this).closest('table').data("url");
        var id = $(this).closest('tr').attr('id');
        window.location = url+"?id="+id);
    });
});

Questo è utile anche perché non è necessario aggiungere l'attributo dei dati sui clic a ogni tr. L'altra cosa positiva è che non stiamo usando una classe per innescare un clic poiché le classi dovrebbero davvero essere usate solo per lo stile.


2

Una soluzione che non è stata menzionata in precedenza è quella di utilizzare un singolo collegamento in una cella e alcuni CSS per estendere questo collegamento sulle celle:

table {
  border: 1px solid;
  width: 400px;
  overflow: hidden;
}

tr:hover {
  background: gray;
}

tr td {
  border: 1px solid;
}

tr td:first-child {
  position:relative;
}

a:before {
  content: '';
  position:absolute;
  left: 0;
  top: 0;
  bottom: 0;
  display: block;
  width: 400px;
}
<table>
  <tr>
    <td><a href="https://google.com">First column</a></td>
    <td>Second column</td>
    <td>Third column</td>
  </tr>
  <tr>
    <td><a href="https://stackoverflow.com">First column</a></td>
    <td>Second column</td>
    <td>Third column</td>
  </tr>
</table>


Sembra piuttosto elegante. MA la demo del link di Google non funziona. Stackoverflow uno fa. Probabilmente solo Google sta facendo il culo come spesso accade. Forse link a Bing :-) Le serve bene. Comunque v bella e ordinata soluzione.
BeNice,

Questo mi funziona !! Bella soluzione. Una cosa da notare è che la larghezza di a: before deve essere abbastanza lunga da coprire il tavolo.
Arst

1
<tbody>
    <tr data-href='www.bbc.co.uk'>
        <td>Blah Blah</td>
        <td>1234567</td>
        <td>£158,000</td>
    </tr>
    <tr data-href='www.google.com'>
        <td>Blah Blah</td>
        <td>1234567</td>
        <td>£158,000</td>
    </tr>
</tbody>

<script>
    jQuery(document).ready(function ($) {
        $('[data-href]').click(function () {
            window.location = $(this).data("href");
        });
    });
</script>

Mentre la soluzione principale qui è eccezionale, la mia soluzione elimina la necessità di lezioni. Tutto quello che devi fare è aggiungere l'attributo data-href con l'URL al suo interno.


1

Ho investito molto tempo nel tentativo di risolvere questo problema.

Esistono 3 approcci:

  1. Usa JavaScript. Gli svantaggi chiari: non è possibile aprire una nuova scheda in modo nativo e quando si passa sopra la riga non ci sarà alcuna indicazione sulla barra di stato come hanno i normali collegamenti. Anche l'accessibilità è una domanda.

  2. Usa solo HTML / CSS. Questo significa mettere <a>nidificati sotto ciascuno <td>. Un approccio semplice come questo violino non funziona, perché la superficie cliccabile non è necessariamente uguale per ogni colonna. Questa è una seria preoccupazione per la UX. Inoltre, se hai bisogno di un <button>sulla riga, non è un codice HTML valido annidarlo sotto il <a>tag (anche se i browser sono d'accordo).

    Ho trovato altri 3 modi per implementare questo approccio. Il primo è ok, gli altri due non sono fantastici.

    a) Dai un'occhiata a questo esempio :

    tr {
      height: 0;
    }
    
    td {
      height: 0;
      padding: 0;
    }
    
    /* A hack to overcome differences between Chrome and Firefox */
    @-moz-document url-prefix() {
      td {
        height: 100%;
      }
    }
    
    a {
      display: block;
      height: 100%;
    }

    Funziona, ma a causa delle incoerenze tra Chrome e Firefox richiede un hack specifico del browser per superare le differenze. Inoltre Chrome allineerà sempre il contenuto della cella verso l'alto, il che può causare problemi con testi lunghi, specialmente se sono coinvolte diverse altezze di linea.

    b) Impostazione <td>su { display: contents; }. Questo porta ad altri 2 problemi:

    b1. Se qualcun altro prova a modellare direttamente il <td>tag, come impostandolo su { width: 20px; }, dobbiamo in qualche modo passare quello stile al <a>tag. Abbiamo bisogno di un po 'di magia per farlo, probabilmente più magia che in alternativa a Javascript.

    b2. { display: contents; }è ancora sperimentale; in particolare non è supportato su Edge.

    c) Impostazione <td>su { height: --some-fixed-value; }. Questo non è abbastanza flessibile.

  3. L'ultimo approccio, che raccomando di pensare seriamente, è di non usare affatto le file cliccabili . Le righe cliccabili non sono una grande esperienza UX: non è facile contrassegnarle visivamente come cliccabili, e pone delle sfide quando più parti sono cliccabili all'interno delle righe, come i pulsanti. Quindi una valida alternativa potrebbe essere quella di avere un<a> tag solo sulla prima colonna, visualizzato come un normale link, e dargli il ruolo di navigare nell'intera riga.


0

Ecco un altro modo ...

HTML:

<table>
<tbody>
       <tr class='clickableRow'>
       <td>Blah Blah</td>
       <td>1234567</td>
       <td>£158,000</td>
        </tr>
</tbody>
</table>

Il jQuery:

$(function() {
      $(".clickableRow").on("click", function() {
          location.href="http://google.com";

      });

});

Come possiamo aprirlo in una nuova scheda? @klewis
Khushbu Vaghela,

0
<table>
  <tr tabindex="0" onmousedown="window.location='#';">
    <td>1</td>
    <td>2</td>
    <td>3</td>
  </tr>
</table>

Sostituisci # con l'URL, tabindex="0"rende qualsiasi elemento focalizzabile


-1

Potresti dare alla riga un ID, ad es

<tr id="special"> ... </tr>

e poi usa jquery per dire qualcosa del tipo:

$('#special').onclick(function(){ window="http://urltolinkto.com/x/y/z";})


1
Credo che tu voglia usare la classe invece dell'id perché molto probabilmente avrai più righe e l'id dovrebbe essere usato solo per un oggetto.
Programmazione del

-11

Perché non dovremmo usare i tag "div" ...

<div>

  <a href="" >     <div>  Table row  of content here..  </div>    </a>

</div>

1
dovresti migliorare la tua risposta con css display: table
m1crdy

Migliora la risposta con l'aggiunta di css
Prathamesh More
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.