Bir HTML Tablosundaki Sütunu Gizle / Göster


148

Birkaç sütun içeren bir HTML tablom var ve jquery kullanarak bir sütun seçici uygulamam gerekiyor. Bir kullanıcı bir onay kutusunu tıkladığında, tablodaki ilgili sütunu gizlemek / göstermek istiyorum. Tablodaki her td'ye bir sınıf eklemeden bunu yapmak istiyorum, jquery kullanarak tüm bir sütunu seçmenin bir yolu var mı? Aşağıda bir HTML örneği verilmiştir.

<table>
    <thead>
        <tr><th class="col1">Header 1</th><th class="col2">Header 2</th><th class="col3">Header 3</th></tr>
    </thead>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
</table>

<form>
    <input type="checkbox" name="col1" checked="checked" /> Hide/Show Column 1 <br />
    <input type="checkbox" name="col2" checked="checked" /> Hide/Show Column 2 <br />
    <input type="checkbox" name="col3" checked="checked" /> Hide/Show Column 3 <br />
</form>

2
Umarım aşağıdaki site yardımcı olur: fiendish.demon.co.uk/html/javascript/hidetablecols.html

Bu çözümü jQuery kullanarak uyguladım ve benim için mükemmel çalıştı: http://www.devcurry.com/2009/07/hide-table-column-with-single-line-of.html
Aaron

1
Kullanıcı344059'un yorumuna göre, işte bozuk bağlantı için web arşivi http://www.fiendish.demon.co.uk/html/javascript/hidetablecols.html
KyleMit

Yanıtlar:


84

Bunu her td'ye bir sınıf eklemeden yapmak istiyorum

Şahsen, sınıfın her biri için td / th / col yaklaşımını kullanırdım. Ardından, aşağıdaki gibi stil kurallarını varsayarak, kapsayıcıdaki className'e tek bir yazma özelliğini kullanarak sütunları açıp kapatabilirsiniz:

table.hide1 .col1 { display: none; }
table.hide2 .col2 { display: none; }
...

Bu, herhangi bir JS döngü yaklaşımından daha hızlı olacak; gerçekten uzun tablolar için yanıt verme konusunda önemli bir fark yaratabilir.

IE6'yı desteklemekten kurtulabilirseniz, sınıf özniteliklerini tds'ye eklemek zorunda kalmamak için bitişik seçiciler kullanabilirsiniz. Veya alternatif olarak, endişeniz işaretlemeyi daha temiz hale getiriyorsa, bunları bir başlatma adımında otomatik olarak JavaScript'ten ekleyebilirsiniz.


7
Tavsiye için teşekkürler, HTML'yi daha temiz tutmak istemiştim, ancak tablo boyutu 100 satıra yaklaştıkça performans kesinlikle bir sorun haline geldi. Bu çözüm 2-5 kat performans artışı sağladı.
Brian Fisher

2
Bu yaklaşım benim için performans açısından harikalar yarattı. Teşekkürler!
axelarge

4
Benim css bu katma .hidden {display:none;}ve kullanılan .addClass('hidden')ve .removeClass('hidden')daha biraz hızlıydı .hide()ve .show().
styfle

253

2. sütunu gizleyen jQuery kullanan bir kod satırı:

$('td:nth-child(2)').hide();

Tablonuzun başlığı (th) varsa, şunu kullanın:

$('td:nth-child(2),th:nth-child(2)').hide();

Kaynak: Tek satırlık bir jQuery koduyla Tablo Sütununu Gizleme

jsFiddle kodu test etmek için: http://jsfiddle.net/mgMem/1/


İyi bir kullanım örneği görmek istiyorsanız, blog yazıma bir göz atın:

JQuery ile bir tablo sütununu gizleyin ve satırları değere göre renklendirin .


1
Örnekte olmadıkları için, bunun colspans'ı görmezden geldiği bir sorun yok mu? Yine de kullanmıyorsanız iyi. Bununla ilgili başka bir soru daha var: stackoverflow.com/questions/1166452/…
Kim R

2
Altbilgiyi çağrı cihazı ile gizlemekten kaçınmak için tbody'yi seçiciye eklemem gerekiyordu: $ ('. Webgrid tbody td: nth-child (1), .webgrid th: nth-child (1)'). Hide ();
Alex

@KimR Bu, colspan sorunları için yardımcı olabilir stackoverflow.com/questions/9623601/…
yunzen

Tam olarak nedenini bilmiyorum, ancak bunun yerine 'n'inci' türünü kullanmak zorunda kaldım. Örneğin: $ ['table td: nth-of-type (2)'). Hide ();
Leopoldo Sanczyk

1
@golimar evet ... bunu kısıtlamak için, hedeflemek istediğiniz tabloya bir CSS sınıfı eklemeniz gerekir. Şöyle bir şey:.my-table-class td:nth-child(2)
Leniel Maccaferri

12

kolagrupları kullanabilirsiniz:

<table>
    <colgroup>
       <col class="visible_class"/>
       <col class="visible_class"/>
       <col class="invisible_class"/>  
    </colgroup>
    <thead>
        <tr><th class="col1">Header 1</th><th class="col2">Header 2</th><th class="col3">Header 3</th></tr>
    </thead>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
    <tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
</table>

o zaman senaryonuz sadece arzu <col>sınıfını değiştirebilir .


Cologroup'un çapraz tarayıcı desteğine sahip olmadığını hatırlıyorum, bu artık doğru değil mi?
Brian Fisher

Olabilir. ben bu yöntemi yüksek sütunlar için kullanıyorum (firefox, safari, chrome çalışıyor) IE'de hiç denemedim.
Luis Melgratti

@Brian - IE8 çalışmıyor ve IE7 etkinleştirilmiş IE8 çalışıyor gibi görünüyor.
Nordes

4
Bu artık modern tarayıcıda (Chrome ve Firefox) çalışmıyor gibi görünüyor
JBE

1
@JBE: kesin konuşmak gerekirse, bu yapar modern tarayıcılarda çalışmasını bir dereceye kadar . $('table > colgroup > col.yourClassHere')JQuery seçiciyi kullanarak, tüm sütunun arka plan rengini yine de ayarlayabilirsiniz, ancak artık sütun görünürlüğünü değiştiremezsiniz. Test edilen tarayıcılar MSIE 11 , Safari 5 , Chromium 44 , Opera 12 , Mozilla SeaMonkey 2.40 , Mozilla Firefox 43'tür . "HTML 4.01'deki özniteliklerin çoğu HTML5'te desteklenmez" - buraya bakın .
Bass

12

İşte sütun başına bir miktar kullanıcı etkileşimi sağlayan biraz daha tam özellikli bir cevap. Bu dinamik bir deneyim olacaksa, her sütunda, sütunu gizleme yeteneğini gösteren tıklanabilir bir geçiş ve ardından önceden gizlenmiş sütunları geri yükleme yolu olması gerekir.

Bu, JavaScript'te şuna benzer:

$('.hide-column').click(function(e){
  var $btn = $(this);
  var $cell = $btn.closest('th,td')
  var $table = $btn.closest('table')

  // get cell location - https://stackoverflow.com/a/4999018/1366033
  var cellIndex = $cell[0].cellIndex + 1;

  $table.find(".show-column-footer").show()
  $table.find("tbody tr, thead tr")
        .children(":nth-child("+cellIndex+")")
        .hide()
})

$(".show-column-footer").click(function(e) {
    var $table = $(this).closest('table')
    $table.find(".show-column-footer").hide()
    $table.find("th, td").show()

})

Bunu desteklemek için tabloya bazı işaretlemeler ekleyeceğiz. Her bir sütun başlığına, tıklanabilir bir şeyin görsel bir göstergesi sağlamak için buna benzer bir şey ekleyebiliriz.

<button class="pull-right btn btn-default btn-condensed hide-column" 
            data-toggle="tooltip" data-placement="bottom" title="Hide Column">
    <i class="fa fa-eye-slash"></i>  
</button>

Kullanıcının tablo alt bilgisindeki bir bağlantı aracılığıyla sütunları geri yüklemesine izin vereceğiz. Varsayılan olarak kalıcı değilse, başlıkta dinamik olarak açmak, tablonun etrafında dolanabilir, ancak gerçekten istediğiniz yere koyabilirsiniz:

<tfoot class="show-column-footer">
   <tr>
    <th colspan="4"><a class="show-column" href="#">Some columns hidden - click to show all</a></th>
  </tr>
</tfoot>

Temel işlev budur. İşte aşağıda birkaç şeyin daha açıklandığı bir demo. Ayrıca, düğmenin amacını netleştirmek, düğmeyi bir tablo başlığına göre biraz daha organik bir şekilde biçimlendirmek ve geçişi biraz daha az yapmak için bazı (biraz riskli) css animasyonları eklemek için sütun genişliğini daraltmak için bir araç ipucu ekleyebilirsiniz. ürkek.

Demo Screengrab

JsFiddle ve Yığın Parçacıkları'nda Çalışma Demosu :


en yakın 1 sütunu saklıyorsunuz, en yakın 3 sütun nasıl gizlenir?
Nirmal Goswami

masamı kontrol et - i.stack.imgur.com/AA8iZ.png ve tablo html - stackoverflow.com/questions/50838119/… düğmesini içeren soru A, B ve C'den sonra gelecek
Nirmal Goswami

Bu kadar eski bir cevabı canlandırdığım için üzgünüm, ancak bazı sütunları varsayılan olarak gizli olarak ayarlamanın kolay bir yolu var mı? Bunu yapmaya çalışıyorum $(document).readyama şansım yok
RobotJohnny

1
@RobotJohnny, güzel soru. Bu, .hide-colsütunları kaldırmak için sınıfı kullanıyor , ancak aynı zamanda durumu belirtmek için de kullanılabilir, böylece - html'yi oluştururken .hide-colher birine td& ekleyebilir ve trtamamlayabilirsiniz. Ya da daha az yere eklemek isterseniz, başlığa koyun (bu durum bir yere gitmelidir) ve init'te, bu sütun indeksini çocuklar arasında gizlemek için kullanın. Şu anda, kod yalnızca tıklamadaki konumu dinliyor, ancak sınıf konumunu aramak için de değiştirilebilir. Ayrıca, mutlu türkiye günü
KyleMit

1
@RobotJohnny, kod örneğini başlatma işlemlerini de içerecek şekilde güncelledim. Html'nizde class='hide-col'istediğiniz herhangi bir yere bırakın (muhtemelen thead > tr > then mantıklı olanıdır ve o sütundaki tüm hücreleri gizlediğinden ve dinamik olarak geri yükleme alt
bilgisini

11

Aşağıdakiler bunu yapmalıdır:

$("input[type='checkbox']").click(function() {
    var index = $(this).attr('name').substr(2);
    $('table tr').each(function() { 
        $('td:eq(' + index + ')',this).toggle();
    });
});

Bu test edilmemiş koddur, ancak ilke, her satırda, onay kutusu adından çıkarılan seçilen dizine karşılık gelen tablo hücresini seçmenizdir. Elbette seçicileri bir sınıf veya kimlik ile sınırlayabilirsiniz.


5

Ve tabii ki CSS, şunları destekleyen tarayıcılar için tek yol nth-child:

table td:nth-child(2) { display: none; }

Bu, IE9 ve daha yeni sürümler içindir.

Kullanım durumunuz için, sütunları gizlemek için birkaç sınıfa ihtiyacınız olacak:

.hideCol1 td:nth-child(1) { display: none;}
.hideCol2 td:nth-child(2) { display: none;}

ect ...


2

Aşağıdakiler, birkaç küçük değişiklikle Eran'ın kodu üzerine inşa ediliyor. Test edildi ve Firefox 3, IE7'de iyi çalışıyor gibi görünüyor.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
                "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<script>
$(document).ready(function() {
    $('input[type="checkbox"]').click(function() {
        var index = $(this).attr('name').substr(3);
        index--;
        $('table tr').each(function() { 
            $('td:eq(' + index + ')',this).toggle();
        });
        $('th.' + $(this).attr('name')).toggle();
    });
});
</script>
<body>
<table>
<thead>
    <tr>
        <th class="col1">Header 1</th>
        <th class="col2">Header 2</th>
        <th class="col3">Header 3</th>
    </tr>
</thead>
<tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
<tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
<tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
<tr><td>Column1</td><td>Column2</td><td>Column3</td></tr>
</table>

<form>
    <input type="checkbox" name="col1" checked="checked" /> Hide/Show Column 1 <br />
    <input type="checkbox" name="col2" checked="checked" /> Hide/Show Column 2 <br />
    <input type="checkbox" name="col3" checked="checked" /> Hide/Show Column 3 <br />
</form>
</body>
</html>

1
<p><input type="checkbox" name="ch1" checked="checked" /> First Name</p>
.... 
<td class="ch1">...</td>

 <script>
       $(document).ready(function() {
            $('#demo').multiselect();
        });


        $("input:checkbox:not(:checked)").each(function() {
    var column = "table ." + $(this).attr("name");
    $(column).hide();
});

$("input:checkbox").click(function(){
    var column = "table ." + $(this).attr("name");
    $(column).toggle();
});
 </script>

0

Sınıfsız mı? Etiketi daha sonra kullanabilirsiniz:

var tds = document.getElementsByTagName('TD'),i;
for (i in tds) {
  tds[i].style.display = 'none';
}

Ve onlara şunu kullandığını göstermek için:

...style.display = 'table-cell';            
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.