comment faire une ligne dans une table cliquable comme un lien?
Je suis en utilisant Bootstrap et le suivant ne fonctionne pas:
<tbody>
<a href="#">
<tr>
<td>Blah Blah</td>
<td>1234567</td>
<td>£158,000</td>
</tr>
</a>
</tbody>
- JavaScript peut-être mieux pour ce
- Il utilise bootstrap donc je pense qu'il devrait être en mesure de le faire 🙂
- Comment mettre un transparent d'Un élément avant de la ligne? De cette façon, il aurait toutes les propriétés d'un lien réel (barre d'état, clic-milieu, etc...) et aussi de ne pas modifier l'apparence de la table (si désiré).
- Double de html - ligne de la table comme un lien
- getbootstrap.com/docs/4.3/utilities/stretched-link
Vous devez vous connecter pour publier un commentaire.
Note de l'auteur j':
Veuillez regarder les autres réponses ci-dessous, en particulier ceux qui n'utilisent pas de jquery.
Note de l'auteur II:
Préservés pour la postérité, mais sûrement, de la mal approche en 2019. (A même été mauvais en 2017)
Vous êtes en utilisant Bootstrap qui signifie que vous êtes à l'aide de jQuery :^), donc une façon de le faire est:
Bien sûr, vous n'avez pas à utiliser href commutateur ou d'emplacements, vous pouvez faire ce que vous aimez dans la fonction de gestionnaire de clic. Lire sur
jQuery
et comment écrire des gestionnaires d';Avantage de l'utilisation d'un classe sur id, vous pouvez appliquer la solution sur plusieurs lignes:
et votre base de code ne change pas. Le même gestionnaire de prendre soin de toutes les lignes.
Une autre option
Vous pouvez utiliser Bootstrap, jQuery rappels comme ceci (dans un
document.ready
rappel):Cela a l'avantage de ne pas être remise sur la table de tri (ce qui arrive avec l'autre option).
Remarque
Depuis que cela a été posté
window.document.location
est obsolète (ou obsolète à tout le moins) utilisationwindow.location
à la place.href
attribut sur untr
, puisqu'il n'est pas un attribut valide pour cet élément. L'utilisation d'attributs de données à la place:data-url="{linkurl}"
et dans le code js:$(this).data('url')
clickable_row
(CamelCase est contre les normes HTML et doit être en minuscules (j'ai eu des problèmes avec la croix-navigateur un peu de temps avec ce)) et puis le jQuery est$('.clickable_row tr').click(function ...
Mais vraiment, vous devriez être en utilisantdata-
à contenir les données, au lieu dehref
, puisque c'est la spécification de données personnalisés.data-url
et jquery accès comme$(this).data(url);
a
tag avecdisplay: block;
l'intérieur de chaque cellule est un peu gênant, mais il semble que la façon la plus utile pour résoudre ce problème.window.status
avec la configuration par défaut de n'importe quel navigateur moderne. Aussi, à mon avis, "cliquables comme un lien" ne signifie pas seulement "à gauche cliquez sur cliquable". Il est également très décevant d'avoir à emprisonner tous les événements déjà mis en œuvre pour les balises de lien hypertexte. Il semble prometteur sur le papier (dans la mesure où: html propre), mais à la fin, je vois trop d'inconvénients à ne pas envisager d'utiliser<a>
balises à l'intérieur de chaque cellule du tableau ou, comme vous l'avez suggéré, et non à l'aide de tableau (ce qui est aussi assez frustrant pour réel des données tabulaires).$('.table > tbody > tr').click(function() {...do stuff...});
n'a même pas besoin d'une classe, si vous voulez faire des lignes (dans tous les tableaux à la page) cliquables. Cela permet d'économiser beaucoup de travail en ajoutant une nouvelle classe de lignes.on('click', function(){...})
pour inscrire le gestionnaire d'événements click avec de créer dynamiquement des éléments (par exemple, un tableau qui a été retourné par un appel ajax)window.document.location = ...
ne fonctionne pas pour moi quand la page a unform
tag sur la page (par exemple. une autre boîte de sélection qui utilise du javascript). Donc je pencherais pour @MaximeRossini solution de l'utilisation dea
avecdisplay:block;
$("[data-href]").click
encore mieux, pas besoin pour les classesdata-href
attribut pour quelque chose d'autre dans les bibliothèques sous-jacentes ou des modèles.tabindex="0"
surtr
pour faire la ligne peut recevoir le focus. Il est important pour l'accessibilité.Vous ne pouvez pas le faire. Il n'est pas valide HTML. Vous ne pouvez pas mettre un
<a>
entre un<tbody>
et un<tr>
. Essayez plutôt ceci:Lorsque vous travaillez à elle, vous voulez les utiliser JavaScript pour attribuer le gestionnaire de clic à l'extérieur de l'HTML.
<a>
à l'intérieur de l'cliqué ligne. (qui serait également dégrader gracieusement)href
surtr
n'est pas valide avec les spécifications HTML. Mais si vous utilisez une bibliothèque qui peut étendre les fonctionnalités, son parfaitement valable pour une utilisation personnalisée (sans réserve mots-clés) sur les DOM, depuis le cadre de cette fonction en charge. Avec jquery, vous pouvez simplement faire$(.class mycustomtag').click(function() ...
- où onclick est HTML5 spécifiques et peuvent provoquer des problèmes avec les anciens navigateursonClick={() => window.open('https://stackoverflow.com/', '_blank')}
Vous pourriez inclure un point d'ancrage à l'intérieur de chaque
<td>
, comme suit:Vous pouvez ensuite utiliser
display:block;
sur les ancrages pour faire le plein de ligne cliquable.Exemple jsFiddle ici.
C'est probablement la plus optimale que vous allez l'obtenir, sauf si vous recourir à JavaScript.
td
:td { border: 1px solid black; }
tabindex="-1"
sur tous, mais le premier<td>
lien, de sorte que l'utilisateur onglets de la ligne à la ligne, pas de cellule à cellule. De Plus, vous pouvez toujours mettre en évidence/contour de l'ensemble de la ligne si vous voulez en utilisant la:focus-within
CSS pseudo-classe.Une table liée ligne est possible, mais pas avec la norme
<table>
éléments. Vous pouvez le faire en utilisant ledisplay: table
propriétés de style. Ici et ici sont quelques-uns des violons à démontrer.Ce code devrait faire l'affaire:
CSS:
HTML:
Noter que ARIA rôles sont nécessaires pour assurer une bonne accessibilité depuis la norme
<table>
éléments ne sont pas utilisés. Vous devrez peut-être ajouter d'autres rôles commerole="columnheader"
le cas échéant. En savoir plus sur le guide ici./
clé dans Firefox), de navigation (tab
clé), Copier l'adresse du lien, Ouvrir dans un nouvel onglet/fenêtre, etc. même pour accessible / besoins spéciaux des navigateurs. Mon seul pinaille, c'est que je n'aurais pas nest un<div>
à l'intérieur d'un<a>
, de sorte que les cellules pourraient être mieux marqué comme<span>
._tables.scss
et quelques autres aléatoire des morceaux, en remplaçant toutes les occurrences d'éléments de la table avec les classes CSS j'ai choisi 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 ce bat encore tout javascript solution 🙂Une solution plus flexible est de cibler n'importe quoi avec les données d'attribut href. C'était, vous pouvez réutiliser le code facilement dans des endroits différents.
Puis dans votre jQuery seulement la cible de n'importe quel élément avec l'attribut:
Et n'oubliez pas de style css:
Maintenant, vous pouvez ajouter les données d'attribut href pour n'importe quel élément et qu'il fonctionne. Quand j'écris des petits bouts comme cela, je l'aime à être flexible. N'hésitez pas à ajouter de la vanille js solution si vous en avez un.
Vous pouvez utiliser cette amorce composant:
http://jasny.github.io/bootstrap/javascript/#rowlink
Jasny Bootstrap
Les composants manquants pour votre favori avant la fin de cadre.
Utilisation
Via des attributs de données
Ajouter une classe
.rowlink
et attributdata-link="row"
à un<table>
ou<tbody>
élément. Pour d'autres options ajouter le nom des données, comme dansdata-target="a.mainlink"
Une cellule peut être exclu par l'ajout de la.rowlink-skip
classe à la<td>
.Via JavaScript
Appeler le masque de saisie via javascript:
Il y a un beau techniquement le faire avec
<a>
balise à l'intérieur de<tr>
, qui pourrait être sémantiquement incorrect (pourrait vous donner un navigateur avertissement), mais fonctionnera avec aucunJavaScript/jQuery
requis:PS: Notez l'astuce ici est de mettre
<a>
balise comme dernier élément, sinon il va essayer de prendre l'espace de la première<td>
cellule.PPS: Maintenant, votre ligne sera cliquable et vous pouvez utiliser ce lien pour ouvrir dans un nouvel onglet (Ctrl/CMD+clic)
<tr>
éléments ne peuvent pas avoir un<a>
élément comme un enfant. Seulement<td>
et<th>
sont valables enfants. Voir: stackoverflow.com/questions/12634715/...Vous pouvez utiliser onclick javascript méthode de tr et de le rendre cliquable, aussi si vous avez besoin pour construire votre lien à cause de certains détails, vous pouvez déclarer une fonction en javascript et de l'appeler dans le onclick, en passant certaines valeurs.
Ici est une façon en mettant une transparence d'Un élément sur les lignes de la table. Les avantages sont:
Inconvénients:
La table reste est:
D'ajouter les liens (pour chaque ligne) via jQuery JavaScript par l'insertion d'un élément dans chaque colonne et en définissant les propriétés nécessaires:
La largeur et la hauteur peut être difficile, si le nombre de remplissages et les marges sont utilisés, mais en général quelques pixels de large ne devrait même pas question.
Démo en Live ici: http://jsfiddle.net/qo0dx0oo/ (fonctionne sous Firefox mais pas IE ou Chrome, il y a le lien est placé erreur)
Fixe pour Chrome et IE (encore travaille en FF trop): http://jsfiddle.net/qo0dx0oo/2/
onmouseover
Une autre option à l'aide d'un
<a>
, CSS positions et certains jQuery ou JS:HTML:
CSS:
Ensuite, vous devez donner la largeur, en utilisant par exemple jQuery:
Ce code soufflet fera de votre tableau interactif. En cliquant sur les liens dans cet exemple va afficher le lien dans une boîte de dialogue d'alerte au lieu de suivre le lien.
Le code HTML:
Voici le code HTML derrière l'exemple ci-dessus:
Le CSS
Et le CSS:
Le jQuery
Et enfin le jQuery qui fait de la magie:
Ce qu'il fait, c'est quand une ligne est cliqué, une recherche est effectuée pour le href appartenant à un point d'ancrage. Si c'est le cas, la fenêtre de l'emplacement est défini href.
Je connais quelqu'un qui a écrit à peu près la même déjà, cependant mon chemin est le bon sens (div ne peut pas être l'enfant d'Un) et aussi il est préférable d'utiliser des classes.
Vous pouvez imiter une table à l'aide de CSS et de faire un Un élément de la ligne
css:
Vous pouvez ajouter le bouton de rôle à une ligne du tableau et Bootstrap va changer le curseur sans css changements. J'ai décidé d'utiliser ce rôle comme un moyen de faire facilement une ligne cliquable avec très peu de code.
Html
jQuery
Vous pouvez appliquer ce même principe pour ajouter le bouton rôle à n'importe quelle balise.
Accepté la réponse est grande, mais je vous propose une petite alternative si vous ne voulez pas de répéter l'url sur tous les tr.
Si vous mettez l'url ou le href de la table de données d'url et pas de la tr.
C'est aussi bon parce que vous n'avez pas besoin d'ajouter de la cliquez sur l'attribut de données pour chaque tr soit. L'autre bonne chose est que nous ne sommes pas à l'aide d'une classe de déclencher un clic, comme les classes ne devraient vraiment être utilisés pour le style.
Un très solution la plus simple est juste de l'utilisation sur clic, et plus correct, à mon point de vue, parce que cette séparée de la vue et le contrôleur, et vous n'avez pas besoin de coder en dur l'adresse URL ou quoi que plus vous avez besoin de faire accomplir avec le clic.
Il fonctionne avec Angulaire ng-cliquez sur trop.
Exemple de travail ici
Vous pourriez donner à la ligne d'un identifiant, par exemple
<tr id="special"> ... </tr>
et ensuite utiliser jquery pour dire quelque chose comme:
$('#special').onclick(function(){ window="http://urltolinkto.com/x/y/z";})
Ici est d'une autre façon...
Le code HTML:
Le jQuery:
Tandis que la principale solution ici est grand, ma solution élimine la nécessité pour les classes. Tout ce que vous devez faire est d'ajouter les données-un attribut "href" avec l'URL en elle.
Pourquoi nous n'utilisons pas de "div" balises....