2012-04-20 51 views
32

是否可以在<a>標籤中包裝整個表格行?我希望整行成爲可點擊的鏈接。包裝HTML表格行<a>標籤

如果我嘗試以下方法,在鏈接的上方和表外呈現:

此:

<table> 
<a href="value_url"><tr><td>value</td><td>value</td></tr></a> 
<a href="value_url"><tr><td>value</td><td>value</td></tr></a> 
</table> 

呈現這樣的:

<a href="value_url"></a> 
<a href="value_url"></a> 
<table> 
<tr><td>value</td><td>value</td></tr> 
<tr><td>value</td><td>value</td></tr> 
</table> 
+1

這將是相當不錯的提HTML版本 – Teneff 2012-04-20 11:26:44

+0

您可以檢查[這](http://stackoverflow.com/questions/4369206/wrapping-a-table-row-in-a-element -hyperlink-in-html5)問題 – Teneff 2012-04-20 11:28:14

回答

28

在每個TD的鏈接是不是一個很好的選擇和使用js有點髒,這裏是另一種html/css方法:

HTML:

<div class="table"> 
    <a class="table-row" href="/mylink"> 
     <div class="table-cell">...</div> 
     <div class="table-cell">...</div> 
     <div class="table-cell">...</div> 
    </a> 
</div> 

CSS:

.table { display:table; } 
.table-row { display:table-row; } 
.table-cell { display:table-cell; } 
+1

這麼簡單,它的工作原理:http://jsfiddle.net/t2h5bhma/做得好! – Yarin 2015-01-23 15:35:44

+11

這不是一個好方法。這不是語義上的,並且不適合屏幕閱讀器。 – 2015-03-04 09:31:10

+2

您可以探索使用詠歎調角色,使屏幕閱讀器更易於使用。 – 2015-03-04 09:48:53

34

它呈現就像那樣,因爲瀏覽器是尊重W3C規範,只允許<tr>標籤作爲<table>的直接後代。

作爲一個解決方案,你可以要麼把一個<a>標籤內每個<td>指向同一網址:

<table> 
    <tr> 
     <td> 
      <a href="http://url/stuff"> 
       First column 
      </a> 
     </td> 
     <td> 
      <a href="http://url/stuff"> 
       Second column 
      </a> 
     </td> 
    </tr> 
</table> 

或者你可以綁定一個onClick處理器的<tr>使用JavaScript。一個jQuery的例子是這樣的:

$('table tr').click(function() { 
    window.location = 'http://location/here'; 
}); 

,或者甚至更好,使用委託的事件(jQuery的1.7+):

$('table').on('click', 'tr', function() { 
    window.location = 'http://location/here'; 
}); 
+0

感謝您爲我們提供了所有可能的解決方案 – Yarin 2012-04-20 11:33:41

+15

我們曾經使用Javascript版本,並對此表示遺憾。用戶無法按住Ctrl或Shift鍵單擊以在新選項卡/窗口中打開。值得注意的是;它甚至可能在您的應用程序/網站中是可取的。 – 2014-07-10 05:13:11

+1

@BernhardHofmann可以在點擊時捕獲事件並測試event.metaKey或event.ctrlKey,但我同意,它不是很理想,因爲它有時可能被彈出窗口攔截器阻止。 http://stackoverflow.com/a/2445640/436014 – waffl 2015-06-17 15:43:39

8

這是無效的HTML有比theadtbodytfoot其他任何元素一個table的直接孩子,而那些元素只有tr作爲他們的有效的孩子。

其他任何內容必須在tdth之內纔有效。

你所看到的是瀏覽器重構你的DOM,使其儘可能有效。依賴這種行爲的問題在於不同的瀏覽器以不同的方式作出反應。

如果你需要一個tr是互動的(並點擊這些元素引導某處/做某事),你應該使用JavaScript。

但是,簡短的回答,是的,您可以可以做到這一點,但這樣做是無效的,所以請不要這樣做。

對於交互式表的行,雖然,一種解決方案(在普通的JavaScript):

var rows = document.getElementsByTagName('tr'), 
    url; 

for (var i=0,len=rows.length; i<len; i++){ 
    rows[i].onclick = function(){ 
     uri = this.getAttribute('data-url'); 
     window.location = uri; 
    }; 
} 

JS Fiddle demo

(其中,顯然,要求tr元素具有data-url屬性來指定,他們應該鏈接到。)

+0

關於使用數據url的好處 – Yarin 2012-04-20 11:40:05

+0

更好地在表本身上添加一個點擊處理程序並使用事件委託和目標來找出哪個行被點擊。 – 2015-03-04 09:33:02

4

爲什麼你不想就tr點擊事件?不可能有像你想要的錨標籤,所以你可以做點擊事件和添加aditional CSS使它看起來像錨。

的Jquery:

$("table tr").click(function() { 
    window.location = "http://www.google.com/"; 
}); 
+1

顯然我有 - 但你總是尋找非js的解決方案第一個 – Yarin 2012-04-20 11:31:39

+2

因爲你不知道你要去哪裏(懸停和看到網址,就像在一個錨標記),你不能右鍵單擊並複製網址,你不能在新標籤中打開,等等...... – ryanwinchester 2015-08-17 18:05:57

2

你可以使用onclick,這樣你就能得到上述內容動態

<td onclick="window.location='http://www.google.com';" style='cursor: pointer;'>Hello</td> 

http://jsfiddle.net/ankJw/

+1

你需要做的唯一改變是在''中代替'​​'; OP想要使整個表格行可點擊。 – Bojangles 2012-04-20 11:34:22

1

只是在附加給別人我要補充一點,我personnaly喜歡在ASP的情況下做這樣的

<tr onclick="window.location='http://www.google.com';" > 
    <td>Text...</td> 
</tr> 

。 NET MVC

<tr onclick="window.location = '@Url.RouteUrl("Product", new { SeName = @product.SeName })';"> 
7

另一種簡單的,CSS唯一的解決辦法是轉向<a>成塊元件

<tr> 
    <td><a href="#">name 1</a></td><td><a href="#">link 1</a></td>  
</tr> 
<tr> 
    <td><a href="#">name 2</a></td><td><a href="#">link 2</a></td>  
</tr> 

的CSS將是:

td > a { 
    display: block; 
} 

然後<a>將佔用整個<td>,並使整個行可點擊如果鏈接對於連續的每個單元重複,則不帶JS。

https://jsfiddle.net/evwa451n/

+0

好主意。在單元格上使用填充重新引入了不可點擊的空白,因此在「td> a」規則中放置一個平等的邊距以再次填補空白,然後重新應用「td> a」規則上的填充。 – 2017-02-28 16:29:55

+0

@Igoldby什麼是「-ve margin」? – 2017-12-14 17:51:54

+0

@ChuckD正是它所說的。將邊距設置爲等於填充的負值,例如填充4px和邊距:-4px – 2017-12-15 21:58:15