jQuery DataTables: kontrol tablosu genişliği


98

JQuery DataTables eklentisini kullanarak bir tablonun genişliğini kontrol etmekte sorun yaşıyorum. Tablonun kapsayıcı genişliğinin% 100'ü olması gerekir, ancak kap genişliğinden daha az, keyfi bir genişlik olur.

Öneriler takdir ediliyor

Tablo beyanı şuna benzer

<table id="querytableDatasets" class="display" cellspacing="0"
cellpadding="3"     width="100%">

Ve javascript

jQuery('#tab-datasets').load('/cgi-bin/qryDatasets', '', function (){  
    jQuery('#querytableDatasets').dataTable({  
        "bPaginate": false,  
        "bInfo": false,  
        "bFilter": false  
    });  
});  `  

HTML'yi Firebug'da incelerken bunu görürsünüz (eklenen style = "width: 0px;")

<table id="querytableDatasets" class="display" cellspacing="0" 
cellpadding="3" width="100%" style="width: 0px;">

Stillere Firebug'a bakıldığında, table.display stili geçersiz kılındı. Bunun nereden geldiğini göremiyorum

element.style {  
  width:0;}    

-- dataTables.css (line 84
table.display { 
  margin:0 auto;  
  width:100%;  
}  

Bilginize, IE8'de bir sütunun doğru ayarlanmadığı bir sorunla karşılaştım. Suçlu, max-widthmülk setine sahip bir resimdi . Görünen IE8, bu özelliği çok fazla sevmiyor ve görüntü ekranda doğru boyutta olsa bile, veri tablolarıyla ilişkili olarak onu yok sayıyor. widthSorunu düzeltmek için değiştirmek .
John Bubriski

Yanıtlar:


61

Sorunun nedeni, dataTable'ın genişliğini hesaplaması gerektiğidir - ancak bir sekme içinde kullanıldığında, görünmez, dolayısıyla genişlikleri hesaplayamaz. Çözüm, sekme gösterildiğinde 'fnAdjustColumnSizing' çağırmaktır.

Önsöz

Bu örnek, kaydırmalı DataTable'ların jQuery UI sekmeleriyle (veya aslında tablonun başlatıldığında gizli (display: none) öğesinde olduğu başka bir yöntemle) birlikte nasıl kullanılabileceğini gösterir. Bunun özel dikkat gerektirmesinin nedeni, Veri Tabloları başlatıldığında ve gizli bir öğede olduğunda, tarayıcının Veri Tablolarını verecek herhangi bir ölçümünün olmaması ve bu, kaydırma etkinleştirildiğinde sütunların yanlış hizalanmasını gerektirmesidir.

Bunu aşmanın yöntemi fnAdjustColumnSizing API işlevini çağırmaktır. Bu işlev, mevcut verilere göre gerekli olan sütun genişliklerini hesaplayacak ve ardından tabloyu yeniden çizecektir - bu, tablo ilk kez görünür olduğunda tam olarak ihtiyaç duyulan şeydir. Bunun için jQuery UI tabloları tarafından sağlanan 'göster' yöntemini kullanıyoruz. DataTable'ın oluşturulup oluşturulmadığını kontrol ederiz ('div.dataTables_scrollBody' için ekstra seçiciye dikkat edin, bu DataTable başlatıldığında eklenir). Tablo başlatılmışsa, yeniden boyutlandırırız. Tablonun yalnızca ilk gösteriminin yeniden boyutlandırılması için bir optimizasyon eklenebilir.

Başlatma kodu

$(document).ready(function() {
    $("#tabs").tabs( {
        "show": function(event, ui) {
            var oTable = $('div.dataTables_scrollBody>table.display', ui.panel).dataTable();
            if ( oTable.length > 0 ) {
                oTable.fnAdjustColumnSizing();
            }
        }
    } );

    $('table.display').dataTable( {
        "sScrollY": "200px",
        "bScrollCollapse": true,
        "bPaginate": false,
        "bJQueryUI": true,
        "aoColumnDefs": [
            { "sWidth": "10%", "aTargets": [ -1 ] }
        ]
    } );
} );

Bkz bu daha fazla bilgi için.


1
@John McC ile de aynı sorunu yaşıyorum, ancak datatable'ımı bir modale uyguladım, bootstrap kullanıyorum ve bu sorunla sıkışıp kaldım ... sekmeler yerine bootstrap modal kullanarak nasıl uygulayacağınızı biliyor musunuz ?. . gerçekten yardımına ihtiyacım var
cfz

kullanmanızı tavsiye ederim window.resize, örnek bir legacy.datatables.net/ref#fnAdjustColumnSizing
KingRider

"aoColumnDefs": [{"sWidth": "% 10", "aTargets": [-1]}]. Sorunumu düzelttim sadece şunu ekleyin, teşekkürler.
Mina chen

55

DataTable'ları başlattığınızda iki değişkeni değiştirmek isteyeceksiniz: bAutoWidthveaoColumns.sWidth

50px, 100, 120px ve 30px genişliğinde 4 sütununuz olduğunu varsayarak yaparsınız:

jQuery('#querytableDatasets').dataTable({  
        "bPaginate": false,  
        "bInfo": false,  
        "bFilter": false,
        "bAutoWidth": false,
        "aoColumns" : [
            { sWidth: '50px' },
            { sWidth: '100px' },
            { sWidth: '120px' },
            { sWidth: '30px' }
        ]  
    }); 

DataTable'ların başlatılması hakkında daha fazla bilgi http://datatables.net/usage adresinde bulunabilir.

Bu geniş haklar ayarı ile uyguladığınız CSS arasındaki etkileşimi izleyin. Ne kadar yaklaştığınızı görmek için bunu denemeden önce mevcut CSS'nizi yorumlayabilirsiniz.


mmm. Söylediğiniz şey, bunun bAutoWidth'in bir sonucu olduğu: doğru yapmak, sütun genişliği için özellikle akıllı seçimler değil.
John Mac

Ben böyle düşünüyorum. Veriler uzunluk açısından tutarsızsa tablolarım zıplıyor. Bu nedenle aoColumns ve bAutoWidth parametrelerini ekledim.
artlung

1
güzel. sorunumu tamamen çözdüm.
Laguna

Harika @ Laguna! Bunun gibi eski cevapları duymaya bayılıyorum, yardımcı olmaya devam ediyor.
artlung

1
"bAutoWidth": yanlış çalışır. Ama sadece bir soru. Genişlik ayrıntılarını <th> etiketlerime koyarsam iyi bir uygulama olur mu?
finnTheHumin

52
jQuery('#querytableDatasets').dataTable({  
        "bAutoWidth": false
});

2
Bu benim için doğru cevaptı. Boostrap kullanıyorum .table-responsive. Datatable kod ayarı ile kendi genişliği, yoluna çıkıyor.
mac10688

Sekme değiştirme olayındaki genişlik özelliğini kaldırmayı içeren bu aptal soruna çözümümü göndermek için buraya geldim, ancak bu onu düzeltti gibi görünüyor. Teşekkürler. +1
Topher

İlk iki sekmede 3 sekmem ve veri tablom var, ikinci sekmedeki tablo tam genişlikte değildi. bu benim sorunumu çözdü. teşekkürler
Mike Volmar

47

Pekala, bu eklentiye aşina değilim, ancak datatable'ı ekledikten sonra stili sıfırlayabilir misiniz? Gibi bir şey

$("#querydatatablesets").css("width","100%")

.dataTable çağrısından sonra?


1
Bunu da en iyi çözüm olarak buldum, çünkü benim durumumda, sütunlardan herhangi biri görünmez hale getirildiğinde tablo da 100px genişliğe ayarlanıyordu - buraya bakın: datatables.net/forums/discussion/3417/…
mydoghasworms

Benim için işe yarayan çözüm budur. oTable.fnAdjustColumnSizing () ile karşılaştırıldığında veri tablosunun css'si üzerinde daha iyi kontrol sağlar; daha önce bahsedilen çözüm.
Vijay Rumao

11

Veri tablolarının sütun genişlikleriyle ilgili çok sayıda sorun yaşadım. Benim için sihirli çözüm, çizgiyi dahil etmekti

table-layout: fixed;

bu css, tablonun genel CSS'si ile uyumludur. Örneğin, veri tablolarını aşağıdaki gibi tanımladıysanız:

LoadTable = $('#LoadTable').dataTable.....

daha sonra sihirli css satırı Loadtable sınıfına giderdi

#Loadtable {
margin: 0 auto;
clear: both;
width: 100%;
table-layout: fixed;

}


2
Bu yardımcı olur, ancak şimdi sütunlarımın hepsi garip boyutlarda. En fazla veriye sahip sütunların en büyük yüzde genişliğini almasını beklerdim.
cjbarth

7

TokenMacGuys çözümü en iyi şekilde çalışır, çünkü bu jQdataTable'daki bir hatanın sonucudur. $ ['# Sometabe']. DataTable (). FnDestroy () kullanırsanız, tablo genişliği% 100 yerine 100px olarak ayarlanır. İşte hızlı bir düzeltme:

$('#credentials-table').dataTable({
        "bJQueryUI": false,
        "bAutoWidth": false,
        "bDestroy": true,
        "bPaginate": false,
        "bFilter": false,
        "bInfo": false,
    "aoColumns": [
           { "sWidth": "140px" },
           { "sWidth": "300px" },
           { "sWidth": "50px" }       
        ],
        "fnInitComplete": function() {

            $("#credentials-table").css("width","100%");
        }

    });

6

Bu css sınıfını sayfanıza ekleyin, sorunu çözecektir:

#<your_table_id> {
    width: inherit !important;
}

1
Son 30 dakikadır mücadele ettiğim ayrı bir sorun vardı - bu kod satırı sorunu çözdü - bu yüzden bu rastgele yorum için teşekkür etmek istedim.
user1274820

1
İşte tam da bu yüzden ek cevaplar veriyorum
Bahadır Taşdemir

5

Açıkça kullanılarak ayarlanması genişlikleri sWidthher sütun için VE bAutoWidth: falseiçinde dataTablebaşlatma benim (benzer) sorunu çözdü. Taşan yığını seviyorum.


5

Sabit alan olmadan en az bir alanı terk etmelisiniz, örneğin:

$('.data-table').dataTable ({

 "bAutoWidth": false,
 "aoColumns" : [
    null,
    null,
    null,                    
    null,
    {"sWidth": "20px"},
    { "sWidth": "20px"}]
});

Hepsini değiştirebilirsin, ancak sadece birini boş bırakabilirsin, böylece genişleyebilir. TÜMÜNE genişlikler koyarsanız işe yaramaz. Umarım bugün birine yardım ettim!


1
Benim için buydu, tüm sütunları 1px olacak şekilde ayarlıyordum. Birini dışarıda bırakmak sihirli bir şekilde çalışmasını sağladı. Teşekkürler!
demoncodemonkey

4
"fnInitComplete": function() {
    $("#datatables4_wrapper").css("width","60%");
 }

Bu, tüm masa genişliğini ayarlamak için iyi çalıştı. Teşekkürler @Peter Drinnan!


Tablonun üst kapsayıcısını düzgün bir şekilde doldurmasını sağlayamadım. Tablonun CSS'sini ve sargısını genişliğe ayarlamayı denedim:% 100; gözle görülür bir fark olmadan. Yukarıda belirtilen yöntemi denediğimde harikalar yarattı, ancak sarıcıyı göstermiyorum, bunun yerine kendi masasına işaret etmem gerekiyordu. Ama çok teşekkürler Nilani !!
Logic1


3

Buradaki çözümlerin hiçbiri benim için işe yaramadı. Datatables ana sayfasındaki örnek bile göster seçeneğindeki datatable'ın başlatılması için işe yaramadı.

Soruna bir çözüm buldum. İşin püf noktası, sekmeler için etkinleştirme seçeneğini kullanmak ve görünür tabloda fnAdjustColumnSizing () öğesini çağırmaktır :

$(function () {

// INIT TABS WITH DATATABLES
$("#TabsId").tabs({
    activate: function (event, ui) {
        var oTable = $('div.dataTables_scrollBody>table:visible', ui.panel).dataTable();
        if (oTable.length > 0) {
            oTable.fnAdjustColumnSizing();
        }
    }
});

// INIT DATATABLES
// options for datatables
var optDataTables = {
    "sScrollY": "200px",
    "bScrollCollapse": true,
    "bPaginate": false,
    "bJQueryUI": true,
    "aoColumnDefs": [
        { "sWidth": "10%", "aTargets": [-1] }
    ]
};
// initialize data table
$('table').dataTable(optDataTables);

});

2

Sadece JQuery'yi herhangi bir Ajax olmadan normal bir masaya uyguladığım halde, seninle tamamen aynı problemi yaşadığımı söylemek için. Bazı nedenlerden dolayı Firefox, tabloyu ortaya çıkardıktan sonra genişletmiyor. Tabloyu bir DIV'nin içine koyarak ve bunun yerine efektleri DIV'ye uygulayarak sorunu çözdüm.


2

Bunu hazır etkinliğinde mi yapıyorsun?

$ (belge) .ready (işlev () {...});

Boyutlandırma, büyük olasılıkla tam olarak yüklenen belgeye bağlı olacaktır.


yukarıdaki kodu inceleyin - bu div kapsayıcı # sekme veri kümelerinin ajax yükünden gelen geri aramada oluyor. Tablo #querytableVeri Kümeleri / cgi-bin / qryDatasets
John Mac

Bunu anlıyorum, bunun olmasının zamanlamasından emin değilim. Eklenti kaynağına baktığımda, 0px genişliğini ayarlayabildiği tek zaman, doğru tabloyu offSetWidth belirleyemediği zaman gibi görünüyordu ve bunun çok erken çalışmayla ilgili olduğunu anladım.
Mufaka 04

hmm. Ajax yükünden geri çağrının #querytableDatasets tablosu yüklendikten sonra çağrıldığını varsaydım. durumun bu olmayabileceğini düşünüyor musun?
John Mac

BTW, bunun ne zaman çalıştığıyla ilgili sorunuzu yanıtlamak için, kullanıcının bir düğmeyi tıklamasına yanıt olarak
John Mac

Hmm, o zaman daha fazlasını ekleyebileceğimden emin değilim. Bu bir düğme tıklamasıysa, belge tam olarak yüklenmiştir ve bunu hazır olayına eklemek için hiçbir neden yoktur. Tablonun kapsayıcısının genişliğiyle oynayabilir veya (DataTables eklentisinin) mevcut düzeninizin dışında çalışmasını sağlamaya çalışabilirsiniz.
Mufaka

1

Sabit başlık eklentisini kullanarak tablo / hücre genişliğini ayarlamada sorun yaşayan herkes için:

Veri tabloları, sütun genişliği parametreleri için thead etiketlerine dayanır. Bunun nedeni, tablonun iç html'sinin çoğu otomatik olarak oluşturulduğu için gerçekten tek yerel html olmasıdır.

Ancak, hücrenizin bir kısmı tead hücrelerinin içinde depolanan genişlikten daha büyük olabilir.

Örneğin, tablonuzda çok sayıda sütun varsa (geniş tablo) ve satırlarınızda çok fazla veri varsa, "sWidth" çağrısı: td hücre boyutunu değiştirmek düzgün çalışmaz çünkü alt satırlar taşmaya göre td'leri otomatik olarak yeniden boyutlandırıyor içerik ve bu , tablo başlatıldıktan ve init parametrelerini geçtikten sonra gerçekleşir .

Orijinal thead "sWidth": parametreler geçersiz kılınır (küçültülür) çünkü datatable'lar tablonuzun hala varsayılan genişliğinin% 100 olduğunu düşünür - bazı hücrelerin taştığını fark etmez.

Bunu düzeltmek için taşma genişliğini buldum ve tablo başlatıldıktan sonra tabloyu uygun şekilde yeniden boyutlandırarak hesaba kattım - biz oradayken aynı anda sabit başlığımızı da başlatabiliriz:

$(document).ready(function() {
  $('table').css('width', '120%');
  new FixedHeader(dTable, {
        "offsetTop": 40,
      });
});

1

sabit başlığınızı ajax çağrınızın "başarısı" içinde oluşturun, başlık ve satırlarda herhangi bir hizalama problemi yaşamazsınız.

success: function (result) {
              /* Your code goes here */

    var table = $(SampleTablename).DataTable();

        new $.fn.dataTable.FixedHeader(table);
}        

1

Umarım bu, hala mücadele eden birine yardımcı olur.

Masanızı herhangi bir kap içinde tutmayın. Tablo oluşturulduktan sonra tablonun sarmalayıcısını kabınız yapın. Bunun, masayla birlikte başka bir şeyin olduğu yerlerde geçersiz olabileceğini biliyorum, ancak o zaman bu içeriği her zaman geri ekleyebilirsiniz.

Benim için bu sorun, bir kenar çubuğunuz ve aslında bu kenar çubuğunun ofset olan bir kabınız varsa ortaya çıkar.

$(YourTableName+'_wrapper').addClass('mycontainer');

(Bir panel paneli varsayılanı ekledim)
Ve sınıfınız:

.mycontainer{background-color:white;padding:5px;}


0

Masanın etrafına bir div sarılıyken benzer bir sorunla karşılaştım.

Konum ekleniyor: göreli benim için düzeltildi.


#report_container {
 float: right;
 position: relative;
 width: 100%;
}

0

Tablonun içeriğinin tablo üstbilgisinden ve altbilgisinden daha büyük olduğu benzer bir sorun yaşadım. Tablonun etrafına bir div eklemek ve x-overflow'u ayarlamak bu sorunu çözmüş gibi görünüyor:


0

BAutoWidth & aoColumns'dan önceki diğer tüm parametrelerin doğru şekilde girildiğinden emin olun. Önceki herhangi bir yanlış parametre bu işlevi bozacaktır.


0

benzer bir sorun yaşadım ve sütunlardaki metnin kırılmadığını ve bu css kodunu kullanmanın sorunu çözdüğünü gördüm

th,td{
max-width:120px !important;
word-wrap: break-word
}

0

Bunu yapma şeklim bu ..

$('#table_1').DataTable({
    processing: true,
    serverSide: true,
    ajax: 'customer/data',
    columns: [
        { data: 'id', name: 'id' , width: '50px', class: 'text-right' },
        { data: 'name', name: 'name' width: '50px', class: 'text-right' }
    ]
});

0

Bugün aynı problemle karşılaşıyorum.

Çözmek için zor bir yol kullandım.

Kodum aşağıdaki gibidir.

$('#tabs').tabs({
    activate: function (event, ui) {
       //redraw the table when the tab is clicked
       $('#tbl-Name').DataTable().draw();
    }
});

0

Bu çözümü de kontrol edin. bu, DataTable sütun genişliği sorunumu kolayca çözdü

JQuery DataTables 1.10.20, columns.adjust()Bootstrap geçiş sekmesi sorununu düzelten bir yöntem sunar

 $('a[data-toggle="tab"]').on( 'shown.bs.tab', function (e) {
    $.fn.dataTable.tables( {visible: true, api: true} ).columns.adjust();
} );

Lütfen dokümantasyona bakın: Kaydırma ve Önyükleme sekmeleri


-1

Bu iyi çalışıyor.

#report_container {
   float: right;
   position: relative;
   width: 100%;
}
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.