bir tablodaki bir satırın tamamı bağlantı olarak tıklanabilir hale nasıl getirilir?


436

Bootstrap kullanıyorum ve aşağıdakiler çalışmıyor:

<tbody>
    <a href="#">
        <tr>
            <td>Blah Blah</td>
            <td>1234567</td>
            <td>£158,000</td>
        </tr>
    </a>
</tbody>

2
JavaScript bunun için daha iyi olabilir
John Conde

1
Bootstrap kullanıyor, bu yüzden bunu yapabilmesi gerektiğini düşünüyorum :)
Ahmed Masud

Saydam A öğesini satırın önüne koymaya ne dersiniz? Bu şekilde, gerçek bir bağlantının (durum çubuğu, orta tıklama vb ...) tüm özelliklerine sahip olacak ve tablonun görünümünü değiştirmeyecektir (istenirse).
David Balažic


Yanıtlar:


568

Yazarın notu I:

Lütfen aşağıdaki diğer cevaplara, özellikle jquery kullanmayanlara bakın.

Yazarın notu II:

2020'de gelecek nesiller için korunmuştu ama kesinlikle yanlış bir yaklaşım. (2017'de bile deyimsel değildi)

Orijinal Yanıt

Bootstrap kullanıyorsunuz, yani jQuery: ^) kullandığınız için bunu yapmanın bir yolu:

<tbody>
    <tr class='clickable-row' data-href='url://'>
        <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
    </tr>
</tbody>


jQuery(document).ready(function($) {
    $(".clickable-row").click(function() {
        window.location = $(this).data("href");
    });
});

Tabii ki href kullanmak veya konum değiştirmek zorunda değilsiniz, tıklama işleyicisi işlevinde istediğinizi yapabilirsiniz. Okuma jQueryve işleyicilerin nasıl yazılacağı;

ID üzerinden bir sınıf kullanmanın avantajı , çözümü birden çok satıra uygulayabilmenizdir:

<tbody>
    <tr class='clickable-row' data-href='url://link-for-first-row/'>
        <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
    </tr>
    <tr class='clickable-row' data-href='url://some-other-link/'>
        <td>More money</td> <td>1234567</td> <td>£800,000</td>
    </tr>
</tbody>

ve kod tabanınız değişmez. Aynı işleyici tüm satırlarla ilgilenir.

Başka seçenek

Bootstrap jQuery geri aramalarını şu şekilde kullanabilirsiniz ( document.readygeri aramada):

$("#container").on('click-row.bs.table', function (e, row, $element) {
    window.location = $element.data('href');
});

Bu, tablo sıralamasında (diğer seçenekle gerçekleşir) sıfırlanmama avantajına sahiptir.


Not

Gönderildiği window.document.locationiçin window.locationbunun yerine eski (veya en azından kullanımdan kaldırıldı) kullanımı .


105
Ayrıca imleci css: tr.clickableRow {cursor: pointer ile değiştirmek de isteyebilirsiniz. }
Winston Kotzan

78
Sadece kullanmaması gerektiğini eklemek istedim hrefbir özniteliği trbu element için geçerli bir özellik değil çünkü. Bunun yerine veri özniteliklerini kullanın: data-url="{linkurl}"ve js kodunda:$(this).data('url')
Maksim Vi.

12
Her satırda bir sınıf kullanmaktan kaçınabilirsiniz ve tabloyu bir sınıf adıyla dekore edebilirsiniz clickable_row(CamelCase HTML standartlarına karşıdır ve küçük harf olmalıdır (bununla birkaç kez çapraz tarayıcı ile ilgili sorunlar yaşadım)) ve sonra jQuery $('.clickable_row tr').click(function ...Ama gerçekte data-verileri tutmak için kullanmanız gerekir , bunun yerine hrefözel verilerin spesifikasyonu budur. data-urlve jquery buna gibi erişecek$(this).data(url);
Piotr Kula

3
Bilginize: Yapabiliyorsanız, Javascript'i devre dışı bırakmış kişiler için tr'de bir yerde bir bağlantı bırakmalısınız.
hitautodestruct

47
Bu çözümün büyük bir hayranı değil, kullanıcılar fareyle üzerine geldiğinde tarayıcının altında bağlantı URL'sini görmüyor ve daha da önemlisi yeni bir sekmede açmak için bağlantıyı tek tıklayamıyor. Her hücrenin içine bir aetiket eklemek display: block;biraz sinir bozucu ama bu sorunu çözmenin en kullanışlı yolu gibi görünüyor.
Maxime Rossini

222

Bunu yapamazsın. Geçersiz HTML. <a>A <tbody>ve a arasına giremezsiniz <tr>. Bunun yerine şunu deneyin:

<tr onclick="window.location='#';">
        ...
     </tr>

işaretçi görünümü için stil ekle

[data-href] { cursor: pointer; }

Buna kadar çalıştığınızda, tıklama işleyiciyi HTML dışında atamak için JavaScript'i kullanmak istersiniz.


3
@Aquillo OP özellikle bootstrap kullandığını belirtir. yani jQuery çözümü çerçeve içinde daha iyi olurdu
Ahmed Masud

39
@AhmedMasud Bu durumda, evet. Gelecekteki okuyucular için düz JS daha iyi bir çözüm olsa da. Stackoverflow'un amacı bu olduğundan, yorumumu hala geçerli buluyorum.
Menno

3
Davranış ve biçimlendirmenin ayrılması kesinlikle tercih edilecektir. Bir şey varsa, href tr üzerinde geçerli bir özellik değildir söyleyebilirim. Veri-href ile değiştirilmeli ve $ (this) .attr yerine $ (this) .data yazılmalıdır.
davidfurber

1
Veya ".clickableRow" sınıfı olay bağlama yaklaşımının <a>, tıklanan satırın içinde ilkini aramasını sağlayabilirsiniz . (bu da nazikçe bozunur)
Jason Sperske

3
ES6 sözdizimini kullanıyorsanız, bağlantı tıklamasını şu şekilde yürütebilirsiniz:onClick={() => window.open('https://stackoverflow.com/', '_blank')}
Louie Bertoncin

186

Her birinin içine bir çapa ekleyebilirsiniz <td>, şöyle:

<tr>
  <td><a href="#">Blah Blah</a></td>
  <td><a href="#">1234567</a></td>
  <td><a href="#">more text</a></td>
</tr>

Daha sonra display:block;, tüm satırı tıklanabilir hale getirmek için çapalarda kullanabilirsiniz.

tr:hover { 
   background: red; 
}
td a { 
   display: block; 
   border: 1px solid black;
   padding: 16px; 
}

Örnek jsFiddle burada.

Bu muhtemelen JavaScript'e başvurmadığınız sürece alacağınız kadar optimumdur.


11
Bu en iyi çözüm, hiçbir jquery hiçbir javascript sadece CSS, yani benim bağım href değil, <a4j: commandLink /> gibi birden fazla parametre ile farklı olabilir, bu yüzden onu saklıyorum ve sadece stili değiştiriyorum. Çok teşekkürler.
TiyebM

4
@daniel iyi cevap ama hücre aşağı uzanırsa
midstack

4
Harika! Bu çözüm, kullanıcı isterse bağlantının yeni bir sekmede açılmasını sağlar. Ancak boş sütunların bağlantıları olmayacaktır.
Ignacio Pérez

9
@AnnaRouben Katılmam gerekecek: birden fazla benzer bağlantıya sahip olmak, yukarı taraflara kıyasla çok küçük bir dezavantajdır (JS olmadan çalışır, ekran okuyucu, bağlantının nereye gittiğini okuyabilir, yeni sekmede açmak için ctrl-tıklatabilir. ..) Pure-HTML çözümleri yardımcı yazılımlarda JS çözümlerinden neredeyse her zaman daha iyi çalışır.
JJJ

6
Ne kadar erişilebilir olduğu için bu çözümü seviyorum. Kullanıcılar bağlantılar arasında sekme yapabilir ve ayrıca bağlantıları yeni sekmelerde açabilirsiniz. Uygulamamda yaptığım tabindex="-1"ilk <td>bağlantı hariç hepsine konuyor , bu yüzden kullanıcı sekmeleri satırdan satıra, hücreden hücreye değil. Ayrıca, :focus-withinCSS sözde sınıfını kullanmak istiyorsanız tüm satırı vurgulayabilir / ana hatlarıyla açıklayabilirsiniz.
Jonathan

90

Bağlantılı bir tablo satırı mümkündür, ancak standart <table>öğelerle değil. display: tableStil özelliklerini kullanarak yapabilirsiniz . Burada ve burada gösterilecek bazı kemanlar var.

Bu kod hile yapmalıdır:

.table {
  display: table;
}

.row {
  display: table-row;
}

.cell {
  display: table-cell;
  padding: 10px;
}

.row:hover {
  background-color: #cccccc;
}

.cell:hover {
  background-color: #e5e5e5;
}
<link href="https://stackpath.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" type="text/css" />

<div role="grid" class="table">
  <div role="row" class="row">
    <div role="gridcell" class="cell">
      1.1
    </div>
    <div role="gridcell" class="cell">
      1.2
    </div>
    <div role="gridcell" class="cell">
      1.3
    </div>
  </div>

  <a role="row" class="row" href="#">
    <div role="gridcell" class="cell">
      2.1
    </div>
    <div role="gridcell" class="cell">
      2.2
    </div>
    <div role="gridcell" class="cell">
      2.3
    </div>
  </a>
</div>

Standarttan beri uygun erişilebilirliği sağlamak için ARIA rollerine ihtiyaç olduğunu unutmayın. <table> elemanlar kullanılmadığından . role="columnheader"Varsa, gibi ek roller eklemeniz gerekebilir . Daha fazla bilgiyi burada bulabilirsiniz.


13
Şimdi buna dataTables eklentisini uygulamayı deneyin! :)
Afonso Gomes

7
Bu doğru yanıt IMHO'dur, çünkü bağlantılarla ilgili tüm kullanıcı aracılarını korur: arama (ör. /Firefox'ta anahtar), gezinme ( tabanahtar), Bağlantı konumunu kopyala, yeni sekmede / pencerede aç vb. tarayıcılara ihtiyaç duyar. Benim tek nitpick bir <div>iç bir yuva değil <a>, bu yüzden hücreleri olarak daha iyi işaretlenmiş olmasıdır <span>.
Tobia

Bu tür CSS tablolarına üçüncü taraf eklentileri ve kitaplıkları uygulamak biraz daha fazla iş gerektirebilir, ancak genellikle kopyalayıp yapıştırın ve değiştirin. Örneğin, Bootstrap'ın kendi _tables.scssve birkaç rastgele parçasını çoğalttım , tablo öğelerinin tüm oluşumlarını kullanmayı seçtiğim CSS sınıflarıyla değiştirdim (sadece öğelerle aynı: th.th) Faydalara kıyasla çok fazla iş yok, gerçekten .
Tobia

2
Güzel cevap, ama bu sadece masa sadece uygun hizalama için kullanıldıysa bir çözümdür (birçok durumda durum böyle!). Sekmeli veriler için semantik <table>bir nedenden dolayı oradadır. Ama bu hala herhangi bir javascript çözümünü
yeniyor

Bu çok zekice bir çözüm olmasına rağmen, sadece budur. Aslında bir tablo değildir ve yazarın da belirttiği gibi erişilebilirliğe ilişkin sorunlar ortaya koyacaktır. Büyük olasılıkla bir tablo bekleyen ancak bir tablo almak diğer şeylerle ilgili sorunlara neden olacaktır.
Tyson Gibby

25

Aşağıdaki standart Bootstrap 4.3+ kullanılarak elde edildi - jQuery veya ekstra css sınıflarına gerek yok!

Anahtar, stretched-linkhücre içindeki metin üzerinde kullanmak ve <tr>bir içeren blok olarak tanımlamaktır .

<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"/>

<table class="table table-hover">
  <tbody>
    <tr style="transform: rotate(0);">
    <th scope="row"><a href="#" class="stretched-link">1</a></th>
      <td>Mark</td>
      <td>Otto</td>
      <td>@mdo</td>
    </tr>
    <tr>
      <th scope="row">2</th>
      <td>Jacob</td>
      <td>Thornton</td>
      <td>@fat</td>
    </tr>
    <tr>
      <th scope="row">3</th>
      <td>Larry</td>
      <td>the Bird</td>
      <td>@twitter</td>
    </tr>
  </tbody>
</table>

İçeren bloğu farklı şekillerde tanımlayabilirsiniz, örneğin transform hiçbir değere (yukarıdaki örnekte olduğu gibi).

Daha fazla bilgi için buraya okumak var Bootstrap dokümantasyon için stretched-link.


1
Bu cevap daha fazla oyu hak ediyor. Hiç javascript yok. Ve bunun scope="row"için ne var ? Kapsamı kullanmıyorum ve satır hala bir bağlantı gibi davranıyor.
Christhofer Natalius

@ChristhoferNatalius teşekkürler! Orijinal cevabım scope="row"şunları içermiyordu - başka neler düzenlenmiş olabileceğini görmek için lütfen geçmişe göz atın. Kod parçacığı (orijinal gibi) çalışıyor gibi göründüğü gibi düzenlemeleri geri almadım ve yeni kodu kapsamlı bir şekilde test etme şansım olmadı :-)
Krishna Gupta

Bunun dezavantajı, bağlantının sütunların üstünde olması, metni kopyalayamamanız ve td'deki öznitelik başlığı fare tarafından üzerine getirildiğinde gösterilmemesidir. Ne yazık ki, eski yollara geri dönmem, bağlantıyı sadece bir sütuna koymam gerekiyor.
Christhofer Natalius

2
Bu çözümü beğendim, ancak ne yazık ki, çapraz tarayıcı değil (Chrome / Firefox Tamam ama Safari değil). Sorun, trtarayıcılar arasında içeren blok için kural olarak tanınmayan etiketten kaynaklanıyor ... stackoverflow.com/questions/61342248/…
pom421

17

Çok daha esnek bir çözüm, data-href özelliğiyle her şeyi hedeflemektir. Bu, kodu farklı yerlerde kolayca yeniden kullanabileceğinizdi.

<tbody>
    <tr data-href="https://google.com">
        <td>Col 1</td>
        <td>Col 2</td>
    </tr>
</tbody>

Sonra jQuery sadece bu özelliği ile herhangi bir öğeyi hedefleyin:

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

Ve css'inizi şekillendirmeyi unutmayın:

[data-href] {
    cursor: pointer;
}

Artık herhangi bir öğeye data-href özniteliğini ekleyebilirsiniz ve çalışacaktır. Bunun gibi parçacıklar yazdığımda esnek olmalarını seviyorum. Varsa, buna vanilya js çözümü eklemekten çekinmeyin.


css ile güzel iş
Amirhossein Tarmast

En sevdiğim çözüm. Aferin 👍🏽
MFrazier

7

Bu önyükleme bileşenini kullanabilirsiniz:

http://jasny.github.io/bootstrap/javascript/#rowlink

Jasny Bootstrap

En sevdiğiniz ön uç çerçeveniz için eksik bileşenler.

<table class="table table-striped table-bordered table-hover">
  <thead>
    <tr><th>Name</th><th>Description</th><th>Actions</th></tr>
  </thead>
  <tbody data-link="row" class="rowlink">
    <tr><td><a href="#inputmask">Input mask</a></td><td>Input masks can be used to force the user to enter data conform a specific format.</td><td class="rowlink-skip"><a href="#">Action</a></td></tr>
    <tr><td><a href="http://www.jasny.net/" target="_blank">jasny.net</a></td><td>Shared knowledge of Arnold Daniels aka Jasny.</td><td class="rowlink-skip"><a href="#">Action</a></td></tr>
    <tr><td><a href="#rowlinkModal" data-toggle="modal">Launch modal</a></td><td>Toggle a modal via JavaScript by clicking this row.</td><td class="rowlink-skip"><a href="#">Action</a></td></tr>
  </tbody>
</table>

kullanım

Veri özellikleri üzerinden

Bir veya öğeye sınıf .rowlinkve nitelik ekleyin . Diğer seçenekler veriye adını ekleme için olduğu gibi bir hücreye ekleyerek dışlanabilir için sınıf .data-link="row"<table><tbody>data-target="a.mainlink".rowlink-skip<td>

JavaScript ile

Giriş maskesini javascript ile arayın:

$('tbody.rowlink').rowlink()

6

İçinde <a>etiketle teknik olarak yapmanın güzel bir yolu var <tr>, bu da semantik olarak yanlış olabilir (size bir tarayıcı uyarısı verebilir), ancak JavaScript/jQuerygerekli olmadan çalışacaktır :

<!-- HTML -->
<tbody>
  <tr class="bs-table-row">
     <td>Blah Blah</td>
     <td>1234567</td>
     <td>£158,000</td>
     <a class="bs-row-link" href="/your-link-here"></a>
  </tr>
</tbody>

/* CSS */
.bs-table-row {
  position: 'relative';
}

.bs-row-link {
  position: 'absolute';
  left: 0;
  height: '36px'; // or different row height based on your requirements
  width: '100%';
  cursor: 'pointer';
}

Not: Buradaki hilenin <a>etiketi son öğe olarak koymak olduğuna dikkat edin , aksi takdirde ilk <td>hücrenin alanını almaya çalışacaktır .

PPS: Artık tüm satırınız tıklanabilir olacak ve bu bağlantıyı yeni sekmede de açmak için kullanabilirsiniz (Ctrl / CMD + tıklama)


Bu benim cevabımla aynı değil mi?
David Balažic

Bu cevaplar mükemmel görünse de, aslında işe yaramaz, çünkü <tr>öğelerin <a>çocuk olarak bir öğesi olamaz . Sadece <td>ve <th>geçerli çocuklar. Bkz. Stackoverflow.com/questions/12634715/…
funkybunky

5

Tr'de onclick javascript yöntemini kullanabilir ve tıklanabilir hale getirebilirsiniz, ayrıca bazı ayrıntılar nedeniyle bağlantınızı oluşturmanız gerekirse, javascript'te bir işlev bildirebilir ve bazı değerleri ileterek onclick'de çağırabilirsiniz.


5

İşte tablo satırlarının üzerine şeffaf bir A öğesi koyarak bir yol. Avantajları:

  • gerçek bir bağlantı öğesidir: fareyle üzerine geldiğinde işaretçi değişir, durum çubuğunda hedef bağlantıyı gösterir, klavyede gezinebilir, yeni sekmede veya pencerede açılabilir, URL kopyalanabilir, vb.
  • tablo, bağlantı eklenmeden aynı görünüyor
  • tablo kodunda değişiklik yok

Dezavantajları:

  • A öğesinin boyutu bir komut dosyasında, hem oluşturma sırasında hem de kapsadığı satırın boyutundaki herhangi bir değişiklikten sonra ayarlanmalıdır (aksi takdirde, tablo boyutu da ayarlanmışsa, yine de JavaScript olmadan yapılabilir. HTML veya CSS'de)

Tablo şu şekilde kalır:

<table id="tab1">
<tbody>
        <tr>
            <td>Blah Blah</td>
            <td>1234567</td>
            <td>£158,000</td>
        </tr>
</tbody>
</table>

Her bir ilk sütuna bir A öğesi ekleyerek ve gerekli özellikleri ayarlayarak bağlantıları (her satır için) jQuery JavaScript aracılığıyla ekleyin:

// v1, fixed for IE and Chrome
// v0, worked on Firefox only
// width needed for adjusting the width of the A element
var mywidth=$('#tab1').width();

$('#tab1 tbody>tr>td:nth-child(1)').each(function(index){
    $(this).css('position',  'relative');// debug: .css('background-color', '#f11');
    // insert the <A> element
    var myA=$('<A>');
    $(this).append(myA);
    var myheight=$(this).height();

    myA.css({//"border":'1px solid #2dd', border for debug only
            'display': 'block',
            'left': '0',
            'top': '0',
            'position':  'absolute'
        })
        .attr('href','the link here')
        .width(mywidth)
        .height(myheight)
        ;
    });

Çok sayıda dolgu ve kenar boşluğu kullanılıyorsa, genişlik ve yükseklik ayarı zor olabilir, ancak genel olarak birkaç piksel kapalı bile önemli olmamalıdır.

Canlı demo burada: http://jsfiddle.net/qo0dx0oo/ (Firefox'ta çalışıyor, ancak IE veya Chrome'da çalışmıyor, bağlantı yanlış yerleştirilmiş)

Chrome ve IE için düzeltildi (hala FF'de de çalışıyor): http://jsfiddle.net/qo0dx0oo/2/


2
Akıllı çözüm. Elemanı tembel bir şekilde oluşturduğumu, sadece satırın üzerine gelindiğinde büyük tablolar için büyük performans artışı sağladığını gördüm.
Levi

1
@ levi bunu nasıl yükleyeceğiniz hakkında geri bildirimde bulunabilir misiniz?
Subliminal Hash

@KemalEmin Javascriptonmouseover
brad

5

Düğme rolünü bir tablo satırına ekleyebilirsiniz ve Bootstrap imleci herhangi bir css değişikliği yapmadan değiştirecektir. Bu rolü herhangi bir satırı çok az kodla tıklanabilir hale getirmenin bir yolu olarak kullanmaya karar verdim.

Html

<table class="table table-striped table-hover">
     <tbody>
          <tr role="button" data-href="#">
               <td>Cell 1</td>
               <td>Cell 2</td>
               <td>Cell 3</td>
          </tr>
     </tbody>
</table>

jQuery

$(function(){
     $(".table").on("click", "tr[role=\"button\"]", function (e) {
          window.location = $(this).data("href");
     });
});

Herhangi bir etikete düğme rolünü eklemek için aynı ilkeyi uygulayabilirsiniz.


wow aslında jquery kodu olmadan ui-sref yerine data-href ile çalıştı. sadece imleci parmağınızla değiştirmeniz gerekiyor.
nurp

Bu kusursuz bir ton teşekkürler çalıştı
Ashish Banerjee

4

Aşağıdaki kod, tüm tablonuzu tıklanabilir hale getirecektir. Bu örnekteki bağlantıların tıklatılması, bağlantıyı takip etmek yerine bağlantıyı bir uyarı iletişim kutusunda gösterir.

HTML:

Yukarıdaki örneğin arkasındaki HTML:

    <table id="example">
    <tr>
     <th>&nbsp;</th>
     <th>Name</th>
     <th>Description</th>
     <th>Price</th>
   </tr>
   <tr>
     <td><a href="apples">Edit</a></td>
     <td>Apples</td>
     <td>Blah blah blah blah</td>
     <td>10.23</td>
   </tr>
    <tr>
     <td><a href="bananas">Edit</a></td>
     <td>Bananas</td>
     <td>Blah blah blah blah</td>
     <td>11.45</td>
   </tr>
   <tr>
     <td><a href="oranges">Edit</a></td>
     <td>Oranges</td>
     <td>Blah blah blah blah</td>
     <td>12.56</td>
   </tr>
    </table>

CSS

Ve CSS:

    table#example {
    border-collapse: collapse;   
}
#example tr {
    background-color: #eee;
    border-top: 1px solid #fff;
}
#example tr:hover {
    background-color: #ccc;
}
#example th {
    background-color: #fff;
}
#example th, #example td {
    padding: 3px 5px;
}
#example td:hover {
    cursor: pointer;
}

JQuery

Ve son olarak sihri gerçekleştiren jQuery:

    $(document).ready(function() {

    $('#example tr').click(function() {
        var href = $(this).find("a").attr("href");
        if(href) {
            window.location = href;
        }
    });

});

Bir satır tıklandığında, bir çapa ait href için bir arama yapılır. Biri bulunursa, pencerenin konumu o href olarak ayarlanır.


4

Çok kolay bir seçenek sadece tıklamada ve daha doğru bir şekilde benim görüşüme göre kullanmaktır, çünkü bu görünüm ve denetleyiciyi ayırır ve URL'yi veya kodla daha fazlasını yapmanız gerekenleri kodlamanız gerekmez. . Açısal ng-tıklama ile de çalışır.

<table>
  <tr onclick="myFunction(this)">
    <td>Click to show rowIndex</td>
  </tr>
</table>

<script>
function myFunction(x) {
    alert("Row index is: " + x.rowIndex);
}
</script>

Burada çalışan örnek


1
Elbette bu doğru cevaptır. Diğerleri böyle basit bir şey için çılgınca karmaşıktır. Fare işaretçisini değiştirmek isterseniz, tr: hover {cursor: pointer; } CSS sınıfınıza
Tom Close

1
@TomClose Satır tıklamasının ne yapmasını istediğinize bağlı olarak, bu sorunlu olabilir, örneğin gezinme normal çalışmaz - yeni sekmede / pencerede açmak için vardiya tıklaması yoktur, hedefi görmek için fareyle üzerine
gelmez

4

İşte basit bir çözüm ..

<tr style='cursor: pointer; cursor: hand;' onclick="window.location='google.com';"></tr>

3

Bir , CSS konumları ve bazı jQuery veya JS kullanan başka bir seçenek<a> :

HTML:

<table>
<tr>
    <td>
        <span>1</span>
        <a href="#" class="rowLink"></a>
    </td>
    <td><span>2</span></td>
</tr>
</table>

CSS:

table tr td:first-child {
    position: relative;
}
a.rowLink {
    position: absolute;
    top: 0; left: 0;
    height: 30px;
}
a.rowLink:hover {
    background-color: #0679a6;
    opacity: 0.1;
}

Sonra, örneğin jQuery kullanarak bir genişlik vermeniz gerekir:

    $(function () {
        var $table = $('table');
            $links = $table.find('a.rowLink');

        $(window).resize(function () {
            $links.width($table.width());
        });

        $(window).trigger('resize');
    });

3

Birinin zaten aynı şeyi yazdığını biliyorum, ancak benim yolum doğru yol (div A'nın çocuğu olamaz) ve ayrıca sınıfları kullanmak daha iyidir.

CSS kullanarak bir tabloyu taklit edebilir ve bir A öğesini satır yapabilirsiniz

<div class="table" style="width:100%;">
  <a href="#" class="tr">
    <span class="td">
      cell 1
    </span>
    <span class="td">
      cell 2
    </span>
  </a>
</div>

css:

.table{display:table;}
.tr{display:table-row;}
.td{display:table-cell;}
.tr:hover{background-color:#ccc;}

3

onclick=""gibi newbie için kullanımı ve anlaşılması kolay olduğu için nitelik kullanmayı tercih ederim

 <tr onclick="window.location='any-page.php'">
    <td>UserName</td>
    <td>Email</td>
    <td>Address</td>
</tr>

2

Kabul edilen cevap harika, ancak url'yi her tr'de tekrarlamak istemiyorsanız küçük bir alternatif öneriyorum. Böylece url veya href'i tr veri yerine data-url tablosuna koyarsınız.

<table data-click data-url="href://blah">    
    <tbody>
        <tr id ="2">
            <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
        </tr>
        <tr id ="3">
            <td>Blah Blah</td> <td>1234567</td> <td>£158,000</td>
        </tr>
    </tbody>
    </table

jQuery(document).ready(function($) {
    $('[data-click] tbody tr').click(function() {
        var url = $(this).closest('table').data("url");
        var id = $(this).closest('tr').attr('id');
        window.location = url+"?id="+id);
    });
});

Bu da iyidir çünkü her tr için tıklama verisi özelliğini eklemenize gerek yoktur. Diğer iyi bir şey, sınıfları sadece gerçekten stil için kullanılması gerektiğinden, bir tıklamayı tetiklemek için bir sınıf kullanmıyoruz.


2

Daha önce bahsedilmeyen bir çözüm, bir hücrede tek bir bağlantı ve bu bağlantıyı hücreler üzerinde genişletmek için bazı CSS kullanmaktır:

table {
  border: 1px solid;
  width: 400px;
  overflow: hidden;
}

tr:hover {
  background: gray;
}

tr td {
  border: 1px solid;
}

tr td:first-child {
  position:relative;
}

a:before {
  content: '';
  position:absolute;
  left: 0;
  top: 0;
  bottom: 0;
  display: block;
  width: 400px;
}
<table>
  <tr>
    <td><a href="https://google.com">First column</a></td>
    <td>Second column</td>
    <td>Third column</td>
  </tr>
  <tr>
    <td><a href="https://stackoverflow.com">First column</a></td>
    <td>Second column</td>
    <td>Third column</td>
  </tr>
</table>


Bu oldukça zarif görünüyor. AMA google bağlantı demosu çalışmıyor. Stackoverflow biri yapar. Muhtemelen sadece Google sık sık olduğu gibi değerlendirilmektedir. Belki Bing'e bağlantı :-) Onlara doğru hizmet vermektedir. Her neyse v güzel ve düzenli bir çözüm.
BeNice

Bu beni işe yarıyor !! Güzel çözüm. Dikkat edilmesi gereken bir şey, a: before için genişliğin tabloyu kapsayacak kadar uzun olması gerektiğidir.
Arst

1
<tbody>
    <tr data-href='www.bbc.co.uk'>
        <td>Blah Blah</td>
        <td>1234567</td>
        <td>£158,000</td>
    </tr>
    <tr data-href='www.google.com'>
        <td>Blah Blah</td>
        <td>1234567</td>
        <td>£158,000</td>
    </tr>
</tbody>

<script>
    jQuery(document).ready(function ($) {
        $('[data-href]').click(function () {
            window.location = $(this).data("href");
        });
    });
</script>

Buradaki ana çözüm harika olsa da, çözümüm sınıflara olan ihtiyacı ortadan kaldırıyor. Yapmanız gereken tek şey, içindeki URL ile data-href özelliğini eklemek.


1

Bu sorunu çözmeye çalışmak için çok zaman harcadım.

3 yaklaşım vardır:

  1. JavaScript kullanın. Net dezavantajlar: yerel olarak yeni bir sekme açmak mümkün değildir ve satırın üzerine geldiğinde normal bağlantılar gibi durum çubuğunda herhangi bir gösterge olmayacaktır. Erişilebilirlik de bir sorudur.

  2. Yalnızca HTML / CSS kullanın. Bu, <a>her birinin altına yuva koymak anlamına gelir <td>. Bu keman gibi basit bir yaklaşım işe yaramaz - Çünkü tıklanabilir yüzey her sütun için eşit değildir. Bu ciddi bir UX sorunudur. Ayrıca, bir <button>satıra ihtiyacınız varsa , <a>etiketi altında yerleştirmek geçerli bir HTML değildir (tarayıcılar buna uygun olsa da).

    Bu yaklaşımı uygulamanın başka 3 yolunu buldum. İlk tamam, diğer ikisi büyük değil.

    a) Bu örneğe bir göz atın :

    tr {
      height: 0;
    }
    
    td {
      height: 0;
      padding: 0;
    }
    
    /* A hack to overcome differences between Chrome and Firefox */
    @-moz-document url-prefix() {
      td {
        height: 100%;
      }
    }
    
    a {
      display: block;
      height: 100%;
    }

    Çalışır, ancak Chrome ve Firefox arasındaki tutarsızlıklar nedeniyle, farklılıkların üstesinden gelmek için tarayıcıya özgü bir kesmek gerekir. Ayrıca Chrome, hücre içeriğini her zaman en üste hizalar, bu da özellikle değişen satır yükseklikleri söz konusuysa uzun metinlerde sorunlara neden olabilir.

    b) Ayar <td>için{ display: contents; } . Bu, 2 başka soruna yol açar:

    b1. <td>Etiketi ayarlamak gibi bir başkası doğrudan etiketi biçimlendirmeye çalışırsa { width: 20px; }, bu stili bir şekilde<a> . Bunu yapmak için biraz sihire ihtiyacımız var, muhtemelen Javascript alternatifinden daha fazla sihir.

    b2. { display: contents; }hala deneysel; özellikle Edge'de desteklenmez.

    c) ayarlama <td>için { height: --some-fixed-value; }. Bu yeterince esnek değil.

  3. Ciddi bir şekilde düşünmeyi önerdiğim son yaklaşım, tıklanabilir satırları hiç kullanmamaktır . Tıklanabilir satırlar harika bir UX deneyimi değildir: bunları görsel olarak tıklanabilir olarak işaretlemek kolay değildir ve satırlar içinde düğmeler gibi birden çok parça tıklanabilir olduğunda zorluklar çıkarır. Bu nedenle, uygun bir alternatif, <a>yalnızca ilk sütunda, normal bir bağlantı olarak görüntülenen bir etikete sahip olmak ve ona tüm satırda gezinme rolü vermek olabilir.


0

İşte başka bir yol ...

HTML:

<table>
<tbody>
       <tr class='clickableRow'>
       <td>Blah Blah</td>
       <td>1234567</td>
       <td>£158,000</td>
        </tr>
</tbody>
</table>

JQuery:

$(function() {
      $(".clickableRow").on("click", function() {
          location.href="http://google.com";

      });

});

Nasıl yeni sekmede açabiliriz? @klewis
Khushbu Vaghela

0
<table>
  <tr tabindex="0" onmousedown="window.location='#';">
    <td>1</td>
    <td>2</td>
    <td>3</td>
  </tr>
</table>

# tabindex="0"Değerini url ile değiştirin , herhangi bir öğeyi odaklanabilir hale getirir


-1

Satıra bir kimlik verebilirsiniz, ör.

<tr id="special"> ... </tr>

ve sonra jquery gibi bir şey söylemek için kullanın:

$('#special').onclick(function(){ window="http://urltolinkto.com/x/y/z";})


1
Kimlik yerine sınıf kullanmak istediğinize inanıyorum çünkü büyük olasılıkla birden çok satıra sahip olacaksınız ve kimlik yalnızca bir öğe için kullanılmalıdır.
Programmingjoe

-11

Neden "div" etiketleri kullanmamalıyız ...

<div>

  <a href="" >     <div>  Table row  of content here..  </div>    </a>

</div>

1
css display ile cevabınızı geliştirmelisiniz: table
m1crdy

Css ekleyerek cevabı geliştirin
Prathamesh More
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.