J'utilise Bootstrap et ce qui suit ne fonctionne pas:
<tbody>
<a href="#">
<tr>
<td>Blah Blah</td>
<td>1234567</td>
<td>£158,000</td>
</tr>
</a>
</tbody>
html
html-table
bootstrap-4
user1038814
la source
la source
Réponses:
Note de l'auteur I:
Veuillez consulter les autres réponses ci-dessous, en particulier celles qui n'utilisent pas jquery.
Note de l'auteur II:
Conservé pour la postérité mais sûrement la mauvaise approche en 2020 (était non idiomatique même en 2017)
Réponse originale
Vous utilisez Bootstrap, ce qui signifie que vous utilisez jQuery: ^), donc une façon de le faire est:
Bien sûr, vous n'avez pas besoin d'utiliser href ou de changer d'emplacement, vous pouvez faire ce que vous voulez dans la fonction de gestion des clics. Lisez
jQuery
et comment écrire des gestionnaires;L'avantage d'utiliser une classe sur l' ID est que vous pouvez appliquer la solution à plusieurs lignes:
et votre base de code ne change pas. Le même gestionnaire s'occuperait de toutes les lignes.
Une autre option
Vous pouvez utiliser des rappels Bootstrap jQuery comme ceci (dans un
document.ready
rappel):Cela a l'avantage de ne pas être réinitialisé lors du tri des tables (ce qui se produit avec l'autre option).
Remarque
Étant donné que cela a été publié, son utilisation
window.document.location
est obsolète (ou à tout le moins obsolète)window.location
.la source
href
attribut sur untr
, car ce n'est pas un attribut valide pour cet élément. Utilisez plutôt des attributs de données:data-url="{linkurl}"
et dans le code js:$(this).data('url')
clickable_row
(CamelCase est contre les normes HTML et devrait être en minuscules (j'ai eu des problèmes avec le navigateur croisé à plusieurs reprises avec cela)), puis la jQuery est$('.clickable_row tr').click(function ...
Mais vous devriez vraiment utiliserdata-
pour conserver des données, au lieu dehref
puisque c'est la spécification pour les données personnalisées.data-url
et jquery y accèdera comme$(this).data(url);
a
balise avecdisplay: block;
à l'intérieur de chaque cellule est un peu ennuyeux mais cela semble être le moyen le plus utilisable pour résoudre ce problème.Tu ne peux pas faire ça. Il s'agit d'un code HTML non valide. Vous ne pouvez pas mettre un
<a>
entre un<tbody>
et un<tr>
. Essayez plutôt ceci:ajouter un style pour la vue du pointeur
Lorsque vous travaillez dessus, vous souhaitez utiliser JavaScript pour affecter le gestionnaire de clics en dehors du code HTML.
la source
<a>
à l'intérieur de la ligne cliquée. (cela se dégraderait aussi gracieusement)onClick={() => window.open('https://stackoverflow.com/', '_blank')}
Vous pouvez inclure une ancre à l'intérieur de chaque
<td>
, comme ceci:Vous pouvez ensuite utiliser
display:block;
sur les ancres pour rendre la ligne complète cliquable.Exemple jsFiddle ici.
C'est probablement aussi optimal que vous allez l'obtenir, sauf si vous avez recours à JavaScript.
la source
tabindex="-1"
sur tout sauf le premier<td>
lien, donc l'utilisateur tabule ligne par ligne, pas cellule par cellule. De plus, vous pouvez toujours mettre en évidence / décrire la ligne entière si vous souhaitez utiliser la:focus-within
pseudo-classe CSS.Une ligne de table liée est possible, mais pas avec les
<table>
éléments standard . Vous pouvez le faire en utilisant lesdisplay: table
propriétés de style. Ici et voici quelques violons à démontrer.Ce code devrait faire l'affaire:
Notez que les rôles ARIA sont nécessaires pour assurer une bonne accessibilité puisque les
<table>
éléments standard ne sont pas utilisés. Vous devrez peut-être ajouter des rôles supplémentaires, lerole="columnheader"
cas échéant. En savoir plus sur le guide ici.la source
/
clé dans Firefox), navigation (tab
clé), emplacement du lien de copie, ouverture dans un nouvel onglet / fenêtre, etc. même pour accessible / spécial a besoin de navigateurs. Mon seul pique-nique est que je ne nicherais pas à l'<div>
intérieur d'un<a>
, donc les cellules seraient mieux marquées comme<span>
._tables.scss
et quelques autres pièces aléatoires, en remplaçant toutes les occurrences d'éléments de table par les classes CSS que j'ai choisies d'utiliser (qui sont tout simplement les mêmes que les éléments:th
→.th
) Pas beaucoup de travail par rapport aux avantages, vraiment .<table>
est là pour une raison. Mais cela bat toujours toute solution javascript :)Atteint en utilisant Bootstrap 4.3+ standard comme suit - pas de jQuery ni de classes CSS supplémentaires nécessaires!
La clé est d'utiliser
stretched-link
sur le texte dans la cellule et de définir<tr>
comme un bloc conteneur.Vous pouvez définir le bloc conteneur de différentes manières, par exemple en définissant
transform
une valeur non nulle (comme dans l'exemple ci-dessus).Pour plus d'informations, consultez la documentation Bootstrap pour
stretched-link
.la source
scope="row"
? Je n'utilise pas la portée et la ligne se comporte toujours comme un lien.scope="row"
- veuillez consulter l'historique si vous souhaitez voir ce qui a pu être modifié. Cependant, je n'ai pas annulé les modifications, car l'extrait de code semble fonctionner (tout comme l'original) et je n'ai pas eu la chance de tester le nouveau code de manière exhaustive :-)tr
balise qui n'est pas reconnue comme les règles pour le bloc contenant parmi les navigateurs ... stackoverflow.com/questions/61342248/…stretched-link
.Une solution beaucoup plus flexible consiste à cibler n'importe quoi avec l'attribut data-href. Vous pouviez ainsi réutiliser facilement le code à différents endroits.
Ensuite, dans votre jQuery, ciblez simplement n'importe quel élément avec cet attribut:
Et n'oubliez pas de styliser votre CSS:
Vous pouvez maintenant ajouter l'attribut data-href à n'importe quel élément et cela fonctionnera. Lorsque j'écris des extraits comme celui-ci, j'aime qu'ils soient flexibles. N'hésitez pas à y ajouter une solution vanille js si vous en avez une.
la source
Vous pouvez utiliser ce composant d'amorçage:
http://jasny.github.io/bootstrap/javascript/#rowlink
Jasny Bootstrap
Les composants manquants pour votre framework frontal préféré.
Usage
Via les attributs de données
Ajoutez une classe
.rowlink
et un attributdata-link="row"
à un élément<table>
or<tbody>
. Pour d'autres options, ajoutez le nom à data-, comme dansdata-target="a.mainlink"
Une cellule peut être exclue en ajoutant la.rowlink-skip
classe à la<td>
.Via JavaScript
Appelez le masque de saisie via javascript:
la source
Il y a un bon moyen de le faire techniquement avec une
<a>
balise à l'intérieur<tr>
, qui peut être sémantiquement incorrect (peut vous donner un avertissement de navigateur), mais fonctionnera sans aucunJavaScript/jQuery
requis:PS: Notez que l'astuce ici est de mettre la
<a>
balise comme dernier élément, sinon elle essaiera de prendre l'espace de la première<td>
cellule.PPS: Maintenant, votre ligne entière sera cliquable et vous pouvez également utiliser ce lien pour l'ouvrir dans un nouvel onglet (Ctrl / CMD + clic)
la source
<tr>
éléments ne peuvent pas avoir d'<a>
élément en tant qu'enfant. Seuls<td>
et<th>
sont des enfants valides. Voir: stackoverflow.com/questions/12634715/…Vous pouvez utiliser la méthode javascript onclick dans tr et la rendre cliquable, également si vous devez créer votre lien en raison de certains détails, vous pouvez déclarer une fonction en javascript et l'appeler dans onclick, en passant quelques valeurs.
la source
Voici une façon de placer un élément A transparent sur les lignes du tableau. Les avantages sont:
Désavantages:
Le tableau reste tel quel:
Ajoutez les liens (pour chaque ligne) via jQuery JavaScript en insérant un élément A dans chaque première colonne et en définissant les propriétés nécessaires:
Le réglage de la largeur et de la hauteur peut être délicat, si de nombreux rembourrages et marges sont utilisés, mais en général, quelques pixels désactivés ne devraient même pas avoir d'importance.
Démonstration en direct ici: http://jsfiddle.net/qo0dx0oo/ (fonctionne dans Firefox, mais pas IE ou Chrome, là le lien est mal positionné)
Correction pour Chrome et IE (fonctionne toujours dans FF aussi): http://jsfiddle.net/qo0dx0oo/2/
la source
onmouseover
Vous pouvez ajouter le rôle de bouton à une ligne de tableau et Bootstrap changera le curseur sans aucune modification CSS. J'ai décidé d'utiliser ce rôle comme un moyen de rendre facilement n'importe quelle ligne cliquable avec très peu de code.
Html
jQuery
Vous pouvez appliquer ce même principe pour ajouter le rôle de bouton à n'importe quelle balise.
la source
Voici une solution simple ..
la source
Ce code ci-dessous rendra votre table entière cliquable. Cliquer sur les liens dans cet exemple affichera le lien dans une boîte de dialogue d'alerte au lieu de suivre le lien.
Le HTML:
Voici le code HTML derrière l'exemple ci-dessus:
Le CSS
Et le CSS:
La jQuery
Et enfin le jQuery qui fait que la magie opère:
Ce qu'il fait, c'est quand on clique sur une ligne, une recherche est effectuée pour le href appartenant à une ancre. S'il en trouve un, l'emplacement de la fenêtre est défini sur cette href.
la source
Une option très simple consiste simplement à utiliser le clic, et plus correct, à mon point de vue, car cela sépare la vue et le contrôleur, et vous n'avez pas besoin de coder en dur l'URL ou tout ce que vous devez faire avec le clic . Cela fonctionne également avec Angular ng-click.
Exemple de travail ici
la source
Une autre option utilisant un
<a>
, les positions CSS et certains jQuery ou JS :HTML:
CSS:
Ensuite, vous devez donner une largeur, en utilisant par exemple jQuery:
la source
Je sais que quelqu'un a déjà écrit à peu près la même chose, mais ma façon est la bonne (div ne peut pas être enfant de A) et il est également préférable d'utiliser des classes.
Vous pouvez imiter un tableau en utilisant CSS et faire d'un élément A la ligne
css:
la source
je préférerais utiliser l'
onclick=""
attribut car il est facile à utiliser et à comprendre pour les débutants commela source
La réponse acceptée est excellente, mais je propose une petite alternative si vous ne voulez pas répéter l'url sur chaque tr. Vous mettez donc l'url ou href dans la table data-url et non le tr.
C'est également bon car vous n'avez pas besoin d'ajouter l'attribut de données de clic à chaque tr non plus. L'autre bonne chose est que nous n'utilisons pas de classe pour déclencher un clic, car les classes ne doivent vraiment être utilisées que pour le style.
la source
Une solution qui n'a pas été mentionnée précédemment consiste à utiliser un seul lien dans une cellule et du CSS pour étendre ce lien sur les cellules:
la source
Bien que la solution principale ici soit excellente, ma solution supprime le besoin de classes. Tout ce que vous devez faire est d'ajouter l'attribut data-href avec l'URL qu'il contient.
la source
J'ai investi beaucoup de temps à essayer de résoudre ce problème.
Il existe 3 approches:
Utilisez JavaScript. Les inconvénients évidents: il n'est pas possible d'ouvrir un nouvel onglet en mode natif, et lorsque vous survolez la ligne, il n'y aura aucune indication sur la barre d'état comme les liens normaux. L'accessibilité est également une question.
Utilisez uniquement HTML / CSS. Cela signifie mettre
<a>
imbriqué sous chacun<td>
. Une approche simple comme ce violon ne fonctionne pas - Parce que la surface cliquable n'est pas nécessairement égale pour chaque colonne. Il s'agit d'une grave préoccupation UX. De plus, si vous avez besoin d'un<button>
sur la ligne, ce n'est pas du HTML valide pour l'imbriquer sous la<a>
balise (bien que les navigateurs soient d'accord avec ça).J'ai trouvé 3 autres façons de mettre en œuvre cette approche. Le premier est ok, les deux autres ne sont pas géniaux.
a) Jetez un œil à cet exemple :
Cela fonctionne, mais en raison des incohérences entre Chrome et Firefox, il nécessite un hack spécifique au navigateur pour surmonter les différences. De plus, Chrome alignera toujours le contenu des cellules vers le haut, ce qui peut entraîner des problèmes avec les longs textes, en particulier si différentes hauteurs de ligne sont impliquées.
b) Réglage
<td>
sur{ display: contents; }
. Cela conduit à 2 autres problèmes:b1. Si quelqu'un d'autre essaie de styliser directement la
<td>
balise, comme la définir{ width: 20px; }
, nous devons en quelque sorte transmettre ce style à la balise<a>
balise. Nous avons besoin de magie pour cela, probablement plus de magie que dans l'alternative Javascript.b2.
{ display: contents; }
est encore expérimental; en particulier, il n'est pas pris en charge sur Edge.c) Réglage
<td>
sur{ height: --some-fixed-value; }
. Ce n'est tout simplement pas assez flexible.La dernière approche, à laquelle je recommande de réfléchir sérieusement, est de ne pas utiliser du tout de lignes cliquables . Les lignes cliquables ne sont pas une excellente expérience UX: il n'est pas facile de les marquer visuellement comme cliquables, et cela pose des défis lorsque plusieurs parties sont cliquables dans les lignes, comme les boutons. Une alternative viable pourrait donc être d'avoir une
<a>
balise uniquement sur la première colonne, affichée sous forme de lien régulier, et de lui donner le rôle de parcourir toute la ligne.la source
Voici une autre façon ...
Le HTML:
La jQuery:
la source
Remplacez # par l'url,
tabindex="0"
rend n'importe quel élément focalisablela source
Vous pouvez attribuer un identifiant à la ligne, par exemple
<tr id="special"> ... </tr>
puis utilisez jquery pour dire quelque chose comme:
$('#special').onclick(function(){ window="http://urltolinkto.com/x/y/z";})
la source
Pourquoi ne devrions-nous pas utiliser de balises "div" ....
la source