html - แถวตารางเหมือนลิงก์


101

ฉันไม่สามารถตั้งค่าแถวตารางเป็นลิงก์ไปยังบางสิ่งได้ ฉันสามารถใช้ได้เฉพาะ css และ html ฉันลองสิ่งที่แตกต่างจาก div ในแถวไปยังสิ่งอื่น แต่ก็ยังไม่สามารถใช้งานได้

คำตอบ:


175

คุณมีสองวิธีในการดำเนินการนี้:

  • ใช้จาวาสคริปต์:

    <tr onclick="document.location = 'links.html';">

  • การใช้จุดยึด:

    <tr><td><a href="">text</a></td><td><a href="">text</a></td></tr>

ฉันทำงานที่สองโดยใช้:

table tr td a {
    display:block;
    height:100%;
    width:100%;
}

วิธีกำจัดช่องว่างระหว่างคอลัมน์:

table tr td {
    padding-left: 0;
    padding-right: 0;
}

นี่คือตัวอย่างง่ายๆของตัวอย่างที่สอง: DEMO


8
เนื่องจาก OP กล่าวว่า "เฉพาะ css และ html" ฉันถือว่าการยอมรับเป็นคำตอบที่สอง โปรดทราบว่าหากคุณไม่มี border = 0 คุณจะได้รับ "ลิงก์ที่ขาดหายไป" ช่องว่างระหว่างเซลล์ตาราง
ระบบ PAUSE

1
IIRC เซลล์ตารางจะต้องถูกยุบ แต่สามารถมีเส้นขอบได้
Esteban Küber

5
แท็ก <a> ไม่อนุญาตให้มีองค์ประกอบ html อื่น ๆ ภายใน จากนั้นเราจะเชื่อมโยงแถวตารางทั้งหมดที่มีข้อมูลตารางมากกว่าได้อย่างไร สิ่งนี้: <tr> <a href=""> <td>Text</td> <td> ..... </a> </tr> .. เรามีแบบนี้ไม่ได้เหรอ?
Abimaran Kugathasan

4
ฉันขอแนะนำให้ใช้ "display: inline-block" แทน block ด้วยการแสดงบล็อกฉันพบว่า Chrome ไม่สนใจ "ความสูง: 100%" และไม่ได้สร้างความสูงทั้งหมดของ <td> คลิกได้หากมีรายการอื่นในแถวเดียวกันที่มีความสูงมากกว่า การทำให้อินไลน์บล็อกสามารถแก้ไขปัญหานั้นได้และปัญหาที่อาจเกี่ยวข้องกับการตัดข้อความภายในองค์ประกอบตาราง
ออร์

2
จุดยึดยังคงมีช่องว่างระหว่างคอลัมน์ (ทดสอบด้วย Google Chrome เวอร์ชัน 40.0.2214.115 ม.)
Yuri

55

ฉันสร้างฟังก์ชัน jquery ที่กำหนดเองด้วยตัวเอง:

Html

<tr data-href="site.com/whatever">

jQuery

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

ง่ายและสมบูรณ์แบบสำหรับฉัน หวังว่ามันจะช่วยคุณได้

(ฉันรู้ว่า OP ต้องการ CSS และ HTML เท่านั้น แต่พิจารณา jQuery)

แก้ไข

เห็นด้วยกับ Matt Kantor โดยใช้ data attr. แก้ไขคำตอบด้านบน


สวยสง่าจริงๆ ฉันสงสัยว่ามันถือว่าไม่ถูกต้องตามมาตรฐาน w3c หรือไม่
Mahn

14
ฉันจะใช้data-hrefหรือบางอย่าง
Matt Kantor

2
ลิงก์ JSFiddle นำไปสู่ ​​404
Flox

1
เพิ่มคลาส<table class='tr_link' >และมอบให้.tr_link{cursor:pointer}ใน css เพื่อการใช้งานที่ดีที่สุด
Bagova

6
หากต้องการเพิ่มเอฟเฟกต์มือในการวางเมาส์ให้เพิ่มtr[data-href] { cursor: pointer }สไตล์ชีทของคุณ
OverCoder

27

หากคุณใช้เบราว์เซอร์ที่รองรับคุณสามารถใช้ CSS เพื่อเปลี่ยน<a>เป็นแถวตารางได้:

.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>

แน่นอนคุณถูก จำกัด ให้ไม่ใส่องค์ประกอบบล็อกไว้ในไฟล์<a>. คุณไม่สามารถผสมสิ่งนี้กับแบบปกติได้<table>


1
ความคิดที่ดีขอบคุณ! ดูเหมือนว่าจะทำงานบน Opera 8.5 / , Firefox 0.8 / , IE8, iPhone Simulator / Safari / เก่ามาก :)
biziclop

1
นี่ควรเป็นเทคนิคที่นักพัฒนาพยายามนำมาใช้เนื่องจากเบราว์เซอร์ปัจจุบันรองรับตาราง CSS ทั้งหมด: caniuse.com/#feat=css-table ปัญหาเดียวคือฉันไม่สามารถใช้สิ่งนี้กับ Bootstrap ได้! : '(
shangxiao

13

หากคุณต้องใช้ตารางคุณสามารถใส่ลิงค์ลงในเซลล์ตารางแต่ละเซลล์:

<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>

และทำให้ลิงก์เติมเต็มเซลล์ทั้งหมด:

table tbody tr td a {
  display: block;
  width: 100%;
  height: 100%;
}

หากคุณสามารถใช้<div>s แทนตารางได้ HTML ของคุณจะง่ายกว่ามากและคุณจะไม่ได้รับ "ช่องว่าง" ในลิงก์ระหว่างเซลล์ตาราง:

<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>

นี่คือ CSS ที่มาพร้อมกับ<div>วิธีการ:

.myTable {
  display: table;
}
.myTable a {
  display: table-row;
}
.myTable a span {
  display: table-cell;
  padding: 2px; /* this line not really needed */
}

1
หากคุณต้องการที่จะแสดงข้อมูลตาราง, เสมอใช้ตาราง การใช้คอลเลกชันของ div และช่วงเวลาไม่ถูกต้องตามความหมายจะทำให้คุณอ่านเนื้อหาได้ยากหากคุณสูญเสีย CSS และไม่สามารถเข้าถึงได้สำหรับผู้ที่ใช้โปรแกรมอ่านหน้าจอ
gulima

12

วิธีปกติคือกำหนด JavaScript ให้กับonClickแอตทริบิวต์ของTRองค์ประกอบ

หากคุณไม่สามารถใช้ JavaScript ได้คุณต้องใช้เคล็ดลับ:

  1. เพิ่มลิงก์เดียวกันลงในแต่ละTDแถวเดียวกัน (ลิงก์ต้องเป็นองค์ประกอบด้านนอกสุดในเซลล์)

  2. เปลี่ยนลิงค์เป็นองค์ประกอบบล็อก: a { display: block; width: 100%; height: 100%; }

ส่วนหลังจะบังคับให้ลิงก์เติมเต็มเซลล์ดังนั้นการคลิกที่ใดก็ได้จะเป็นการเรียกลิงก์


7

คุณไม่สามารถรวม<td>องค์ประกอบด้วย<a>แท็ก แต่คุณสามารถใช้ฟังก์ชันที่คล้ายกันได้โดยใช้onclickเหตุการณ์เพื่อเรียกใช้ฟังก์ชัน พบตัวอย่างที่นี่เช่นฟังก์ชันนี้:

<script type="text/javascript">
function DoNav(url)
{
   document.location.href = url;
}
</script>

และเพิ่มลงในตารางของคุณดังนี้:

<tr onclick="DoNav('http://stackoverflow.com/')"><td></td></tr>

21
ปัญหาอย่างหนึ่งในการใช้ onClick เพื่อวัตถุประสงค์ประเภทนี้คือผู้ใช้ไม่สามารถใช้ปุ่มกลางของเมาส์หรือคลิกควบคุมเพื่อเปิดลิงก์ในแท็บใหม่ได้อีกต่อไป (ซึ่งอาจเป็นเรื่องที่น่าหงุดหงิดสำหรับพวกเราที่ชอบเปิดลิงก์ด้วยวิธีนี้) . หมายเหตุอีกด้านหนึ่งไม่มีเหตุผลที่จะทำให้สิ่งต่าง ๆ ซับซ้อนโดยการสร้างฟังก์ชันที่ทำเพียงคำสั่งง่ายๆเพียงคำสั่งเดียว หากคุณจะทำสิ่งนี้ให้ใส่ "document.location.href = ... " โดยตรงในแอตทริบิวต์ onclick
ออร์

7

คำตอบจาก sirwilliam เหมาะกับฉันที่สุด ฉันปรับปรุง Javascript ด้วยการสนับสนุนปุ่มลัด Ctrl + LeftClick (เปิดหน้าในแท็บใหม่) เหตุการณ์ctrlKeyถูกใช้โดยพีซีmetaKeyโดย 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;
    }
});

ตัวอย่าง

http://jsfiddle.net/vlastislavnovak/oaqo2kgs/


ดี. Ctrl + LeftClick ไม่ทำลาย UIX
Yuri

1
ยังคงสูญเสีย 'คลิกขวา -> เปิดในแท็บใหม่' หรือ 'เปิดในหน้าต่างใหม่'
JGInternational

4

ฉันรู้ว่าคำถามนี้มีคำตอบแล้ว แต่ฉันยังไม่ชอบวิธีแก้ปัญหาใด ๆ ในหน้านี้ สำหรับผู้ที่ใช้ JQuery ฉันได้สร้างวิธีแก้ปัญหาขั้นสุดท้ายซึ่งช่วยให้คุณสามารถให้แถวในตารางมีลักษณะการทำงานเหมือนกับ<a>แท็ก

นี่คือทางออกของฉัน:

jQuery คุณสามารถเพิ่มตัวอย่างนี้ลงในไฟล์ javascript ที่รวมมาตรฐานได้

$('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;
    }
});

HTML ตอนนี้คุณสามารถใช้สิ่งนี้กับ<tr>องค์ประกอบใดก็ได้ภายใน HTML ของคุณ

<tr url="example.com">
    <td>value</td>
    <td>value</td>
    <td>value</td>
<tr>

ใกล้เคียงกับ js บริสุทธิ์ document.querySelector('tr[url]').addEventListener("mousedown", function(e){ var click = e.which; var url = this.getAttribute("url"); if(url){ if(click == 1){ window.location.href = url; } else if(click == 2){ window.open(url, '_blank'); window.focus(); } return true; } });
Ramon Bakker

1
ในปี 2014 ที่ไม่มีในvanilla jsคุณเด็กใจแตก; P.
botenvouwer

2

เมื่อฉันต้องการจำลอง<tr>ด้วยลิงก์ แต่เคารพมาตรฐาน html ฉันจะทำสิ่งนี้

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*/
}

ด้วยวิธีนี้เมื่อมีคนใช้เมาส์ของเขาบน TR ทุกแถว (และลิงก์นี้) จะได้รับลักษณะโฮเวอร์และเขาไม่เห็นว่ามีลิงก์หลายลิงก์

หวังว่าจะช่วยใครสักคนได้

ซอที่นี่


1

วิธีนี้ช่วยให้คุณไม่ต้องทำซ้ำลิงก์ใน tr - เพียงแค่ดึงมันออกจาก a ตัวแรก

$(".link-first-found").click(function() {
 var href;
href = $(this).find("a").attr("href");
if (href !== "") {
return document.location = href;
}
});

0
//Style
  .trlink {
    color:blue;
  }
  .trlink:hover {
    color:red;
  }

<tr class="trlink" onclick="function to navigate to a page goes here">
<td>linktext</td>
</tr>

บางทีอาจจะมีบางอย่างตามแนวเหล่านี้ แม้ว่าจะใช้ JS แต่นั่นเป็นวิธีเดียวที่จะทำให้สามารถคลิกแถว (tr) ได้

เว้นแต่คุณจะมีเซลล์เดียวที่มีแท็กจุดยึดที่เติมทั้งเซลล์

จากนั้นคุณไม่ควรใช้ตาราง แต่อย่างใด


0

หลังจากอ่านหัวข้อนี้และอื่น ๆ ฉันได้หาวิธีแก้ไขปัญหาต่อไปนี้ใน 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"));

ในการใช้ให้ใส่ href ใน tr / td / th ที่คุณต้องการให้คลิกได้เช่น: <tr href="http://stackoverflow.com">ว่าคุณต้องการที่จะสามารถคลิกได้ที่ชอบ: และตรวจสอบให้แน่ใจว่าสคริปต์ด้านบนถูกเรียกใช้งานหลังจากสร้างองค์ประกอบ tr แล้ว (โดยการจัดวางหรือใช้ตัวจัดการเหตุการณ์)

ข้อเสียคือมันจะไม่ทำให้ TR ทำงานเป็นลิงก์เหมือนกับ div โดยสิ้นเชิงdisplay: table;และจะไม่สามารถเลือกแป้นพิมพ์หรือมีข้อความแสดงสถานะได้แก้ไข: ฉันทำให้การนำทางแป้นพิมพ์ทำงานได้โดยการตั้งค่า onkeydown, role และ tabIndex คุณสามารถลบส่วนนั้นออกได้หากจำเป็นต้องใช้เมาส์เท่านั้น พวกเขาจะไม่แสดง URL ในแถบสถานะเมื่อวางเมาส์

คุณสามารถจัดรูปแบบให้กับลิงก์ TR โดยเฉพาะด้วยตัวเลือก CSS "tr [href]"


0

ฉันมีวิธีอื่น โดยเฉพาะอย่างยิ่งถ้าคุณต้องการโพสต์ข้อมูลโดยใช้ 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 ตั้งค่าตัวแปรใน SESSIONS ซึ่งหน้าที่คุณกำลังจะอ่านและดำเนินการได้

ฉันต้องการวิธีการโพสต์ตรงไปยังตำแหน่งหน้าต่าง แต่ฉันไม่คิดว่าจะเป็นไปได้


0

ขอบคุณสำหรับสิ่งนี้. คุณสามารถเปลี่ยนไอคอนโฮเวอร์ได้โดยกำหนดคลาส CSS ให้กับแถวเช่น:

<tr class="pointer" onclick="document.location = 'links.html';">

และ CSS ดูเหมือนว่า:

<style>
    .pointer { cursor: pointer; }
</style>

-2

คุณสามารถเพิ่มแท็กในแถวได้หรือไม่?

<tr><td>
<a href="./link.htm"></a>
</td></tr>

นี่คือสิ่งที่คุณกำลังถามใช่ไหม


1
ไม่ฉันต้องการในการคลิกสำหรับพื้นที่แถวทั้งหมด
Max Frai
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.