Je ne peux pas définir ma ligne de table comme lien vers quelque chose. Je ne peux utiliser que css et html. J'ai essayé différentes choses de div en ligne à quelque chose d'autre, mais je ne peux toujours pas le faire fonctionner.
Vous avez deux façons de le faire:
Utiliser javascript:
<tr onclick="document.location = 'links.html';">
Utiliser des ancres:
<tr><td><a href="">text</a></td><td><a href="">text</a></td></tr>
J'ai fait le deuxième travail en utilisant:
table tr td a {
display:block;
height:100%;
width:100%;
}
Pour supprimer l’espace mort entre les colonnes:
table tr td {
padding-left: 0;
padding-right: 0;
}
Voici une simple démonstration du deuxième exemple: DEMO
Je me suis créé une fonction jQuery personnalisée:
<tr data-href="site.com/whatever">
$('tr[data-href]').on("click", function() {
document.location = $(this).data('href');
});
Facile et parfait pour moi. Espérons que cela vous aide.
(Je sais que OP veut uniquement CSS et HTML, mais considérons jQuery)
D'accord avec Matt Kantor en utilisant des données attr. Réponse modifiée ci-dessus
Si vous utilisez un navigateur qui le prend en charge, vous pouvez utiliser CSS pour transformer le <a>
en une ligne de tableau:
.table-row { display: table-row; }
.table-cell { display: table-cell; }
<div style="display: table;">
<a href="..." class="table-row">
<span class="table-cell">This is a TD... ish...</span>
</a>
</div>
Bien sûr, vous ne pouvez pas insérer d'éléments de bloc dans le <a>
. Vous ne pouvez pas non plus mélanger cela avec un <table>
normal.
Si vous devez utiliser un tableau, vous pouvez insérer un lien dans chaque cellule du tableau:
<table>
<tbody>
<tr>
<td><a href="person1.html">John Smith</a></td>
<td><a href="person1.html">123 Fake St</a></td>
<td><a href="person1.html">90210</a></td>
</tr>
<tr>
<td><a href="person2.html">Peter Nguyen</a></td>
<td><a href="person2.html">456 Elm Ave</a></td>
<td><a href="person2.html">90210</a></td>
</tr>
</tbody>
</table>
Et faites en sorte que les liens remplissent les cellules entières:
table tbody tr td a {
display: block;
width: 100%;
height: 100%;
}
Si vous pouvez utiliser <div>
s à la place d'un tableau, votre code HTML peut être beaucoup plus simple et vous n'aurez pas de "trous" dans les liens entre les cellules du tableau:
<div class="myTable">
<a href="person1.html">
<span>John Smith</span>
<span>123 Fake St</span>
<span>90210</span>
</a>
<a href="person2.html">
<span>Peter Nguyen</span>
<span>456 Elm Ave</span>
<span>90210</span>
</a>
</div>
Voici le CSS qui accompagne la méthode <div>
:
.myTable {
display: table;
}
.myTable a {
display: table-row;
}
.myTable a span {
display: table-cell;
padding: 2px; /* this line not really needed */
}
La méthode habituelle consiste à affecter du code JavaScript à l'attribut onClick
de l'élément TR
.
Si vous ne pouvez pas utiliser JavaScript, vous devez utiliser une astuce:
Ajoutez le même lien à chaque TD
de la même ligne (le lien doit être l'élément le plus externe de la cellule).
Transformez les liens en éléments de bloc: a { display: block; width: 100%; height: 100%; }
Ce dernier forcera le lien à remplir toute la cellule. Un clic n'importe où invoquera le lien.
Vous ne pouvez pas encapsuler un élément <td>
avec une balise <a>
, mais vous pouvez obtenir une fonctionnalité similaire en utilisant l'événement onclick
pour appeler une fonction. Un exemple est trouvé ici , quelque chose comme cette fonction:
<script type="text/javascript">
function DoNav(url)
{
document.location.href = url;
}
</script>
Et ajoutez-le à votre table comme ceci:
<tr onclick="DoNav('http://stackoverflow.com/')"><td></td></tr>
La réponse de sirwilliam me convient le mieux. J'ai amélioré le Javascript avec la prise en charge du raccourci clavier Ctrl + LeftClick (ouvre la page dans un nouvel onglet). L'événement ctrlKey
est utilisé par les PC, metaKey
par Mac.
Javascript
$('body').on('mousedown', 'tr[url]', function(e){
var click = e.which;
var url = $(this).attr('url');
if(url){
if(click == 2 || (click == 1 && (e.ctrlKey || e.metaKey))){
window.open(url, '_blank');
window.focus();
}
else if(click == 1){
window.location.href = url;
}
return true;
}
});
Exemple
Je sais que cette question a déjà reçu une réponse, mais je n’aime toujours pas les solutions proposées sur cette page. Pour les utilisateurs de JQuery, j’ai mis au point une solution finale qui permet de donner à la ligne de la table un comportement presque identique à celui de la balise <a>
.
Ceci est ma solution:
jQuery Vous pouvez l'ajouter par exemple à un fichier javascript standard inclus
$('body').on('mousedown', 'tr[url]', function(e){
var click = e.which;
var url = $(this).attr('url');
if(url){
if(click == 1){
window.location.href = url;
}
else if(click == 2){
window.open(url, '_blank');
window.focus();
}
return true;
}
});
HTMLVous pouvez maintenant l'utiliser sur n'importe quel élément <tr>
de votre code HTML
<tr url="example.com">
<td>value</td>
<td>value</td>
<td>value</td>
<tr>
Cela vous évite de dupliquer le lien dans le fichier - il suffit de le pêcher dans le premier fichier.
$(".link-first-found").click(function() {
var href;
href = $(this).find("a").attr("href");
if (href !== "") {
return document.location = href;
}
});
Quand je veux simuler un <tr>
avec un lien mais en respectant les normes html, je le fais.
HTML:
<table>
<tr class="trLink">
<td>
<a href="#">Something</a>
</td>
</tr>
</table>
CSS:
tr.trLink {
cursor: pointer;
}
tr.trLink:hover {
/*TR-HOVER-STYLES*/
}
tr.trLink a{
display: block;
height: 100%;
width: 100%;
}
tr.trLink:hover a{
/*LINK-HOVER-STYLES*/
}
De cette façon, quand quelqu'un va avec sa souris sur un TR, toute la rangée (et ces liens) prend le style de survol et il ne peut pas voir qu'il y a plusieurs liens.
L'espoir peut aider quelqu'un.
Violon _ ICI
J'ai un autre moyen. Surtout si vous avez besoin de publier des données en utilisant jQuery
$(document).on('click', '#tablename tbody tr', function()
{
var test="something";
$.post("ajax/setvariable.php", {ID: this.id, TEST:test}, function(data){
window.location.href = "http://somepage";
});
});
Set variable configure les variables dans SESSIONS que la page que vous allez consulter peut lire et traiter.
J'aimerais vraiment pouvoir poster directement vers une fenêtre, mais je ne pense pas que ce soit possible.
Merci pour cela. Vous pouvez changer l’icône de survol en assignant une classe CSS à la ligne comme ceci:
<tr class="pointer" onclick="document.location = 'links.html';">
et le CSS ressemble à:
<style>
.pointer { cursor: pointer; }
</style>
Après avoir lu ce fil et quelques autres, j'ai trouvé la solution suivante en javascript:
function trs_makelinks(trs) {
for (var i = 0; i < trs.length; ++i) {
if (trs[i].getAttribute("href") != undefined) {
var tr = trs[i];
tr.onclick = function () { window.location.href = this.getAttribute("href"); };
tr.onkeydown = function (e) {
var e = e || window.event;
if ((e.keyCode === 13) || (e.keyCode === 32)) {
e.preventDefault ? e.preventDefault() : (e.returnValue = false);
this.click();
}
};
tr.role = "button";
tr.tabIndex = 0;
tr.style.cursor = "pointer";
}
}
}
/* It could be adapted for other tags */
trs_makelinks(document.getElementsByTagName("tr"));
trs_makelinks(document.getElementsByTagName("td"));
trs_makelinks(document.getElementsByTagName("th"));
Pour l'utiliser, placez le href dans tr/td/th que vous souhaitez être cliquable comme suit: <tr href="http://stackoverflow.com">
. Et assurez-vous que le script ci-dessus est exécuté après la création de l'élément tr (par son emplacement ou à l'aide de gestionnaires d'événements).
L'inconvénient est que les TR ne se comporteront pas comme des liens, comme avec les divs avec Éditer: pour que la navigation au clavier fonctionne en définissant onkeydown, role et tabIndex, vous pouvez supprimer cette partie si vous n’avez besoin que de la souris. Cependant, ils ne montreront pas l'URL dans la barre d'état lors du survol.display: table;
, et qu'ils ne pourront pas être sélectionnés au clavier ni avoir de texte d'état.
Vous pouvez styler spécifiquement le lien TR avec le sélecteur CSS "tr [href]".
//Style
.trlink {
color:blue;
}
.trlink:hover {
color:red;
}
<tr class="trlink" onclick="function to navigate to a page goes here">
<td>linktext</td>
</tr>
Quelque chose dans ce sens peut-être? Bien qu’il utilise JS, c’est la seule façon de rendre une ligne (tr) cliquable.
Sauf si vous avez une seule cellule avec une balise d'ancrage qui remplit la cellule entière.
Et puis, vous ne devriez pas utiliser une table de toute façon.