jQuery DataTables: ความกว้างของตารางควบคุม


99

ฉันมีปัญหาในการควบคุมความกว้างของตารางโดยใช้ปลั๊กอิน jQuery DataTables ตารางควรมีความกว้าง 100% ของความกว้างของคอนเทนเนอร์ แต่จะมีความกว้างตามอำเภอใจแทนที่จะน้อยกว่าความกว้างของคอนเทนเนอร์

ข้อเสนอแนะชื่นชม

การประกาศตารางมีลักษณะดังนี้

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

และจาวาสคริปต์

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

เมื่อตรวจสอบ HTML ใน Firebug คุณจะเห็นสิ่งนี้ (สังเกต style ที่เพิ่ม = "width: 0px;")

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

เมื่อมองไปที่สไตล์ Firebug สไตล์ table.display ได้ถูกแทนที่แล้ว ดูไม่ออกว่ามาจากไหน

element.style {  
  width:0;}    

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

FYI ฉันเพิ่งพบปัญหาที่คอลัมน์ไม่ได้รับการปรับอย่างถูกต้องใน IE8 ผู้ก่อเหตุเป็นภาพที่มีการmax-widthกำหนดคุณสมบัติ เห็นได้ชัดว่า IE8 ไม่ชอบคุณสมบัตินั้นมากเกินไปและเพิกเฉยที่เกี่ยวข้องกับข้อมูลแม้ว่าภาพจะมีขนาดที่เหมาะสมบนหน้าจอก็ตาม การเปลี่ยนเพื่อwidthแก้ไขปัญหา
John Bubriski

คำตอบ:


61

ปัญหานี้เกิดขึ้นเนื่องจาก dataTable ต้องคำนวณความกว้าง - แต่เมื่อใช้ภายในแท็บจะมองไม่เห็นจึงไม่สามารถคำนวณความกว้างได้ วิธีแก้ปัญหาคือเรียก 'fnAdjustColumnSizing' เมื่อแท็บแสดงขึ้น

ปรารภ

ตัวอย่างนี้แสดงให้เห็นว่า DataTables ที่มีการเลื่อนสามารถใช้ร่วมกับแท็บ jQuery UI ได้อย่างไร (หรือวิธีอื่น ๆ โดยที่ตารางอยู่ในองค์ประกอบที่ซ่อนอยู่ (display: none) เมื่อเริ่มต้น) เหตุผลนี้ต้องได้รับการพิจารณาเป็นพิเศษคือเมื่อเริ่มต้น DataTables และอยู่ในองค์ประกอบที่ซ่อนอยู่เบราว์เซอร์จะไม่มีการวัดใด ๆ ที่จะให้ตารางข้อมูลและสิ่งนี้จะต้องใช้ในการจัดแนวคอลัมน์ไม่ตรงเมื่อเปิดใช้งานการเลื่อน

วิธีการแก้ปัญหานี้คือการเรียกใช้ฟังก์ชัน fnAdjustColumnSizing API ฟังก์ชันนี้จะคำนวณความกว้างของคอลัมน์ที่ต้องการตามข้อมูลปัจจุบันจากนั้นวาดตารางใหม่ - ซึ่งเป็นสิ่งที่จำเป็นเมื่อตารางปรากฏเป็นครั้งแรก สำหรับสิ่งนี้เราใช้วิธีการ 'แสดง' ที่จัดเตรียมโดยตาราง jQuery UI เราตรวจสอบเพื่อดูว่า DataTable ถูกสร้างขึ้นหรือไม่ (โปรดสังเกตตัวเลือกพิเศษสำหรับ 'div.dataTables_scrollBody' ซึ่งจะถูกเพิ่มเมื่อเริ่มต้น DataTable) หากตารางเริ่มต้นแล้วเราจะปรับขนาดใหม่ สามารถเพิ่มการปรับให้เหมาะสมเพื่อปรับขนาดใหม่ได้เฉพาะการแสดงตารางแรกเท่านั้น

รหัสเริ่มต้น

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

ดูนี้สำหรับข้อมูลเพิ่มเติม


1
ฉันมีปัญหาเดียวกันกับ @John McC อย่างไรก็ตามฉันใช้ datatable กับโมดอลฉันใช้ bootstrap และฉันติดปัญหานี้.. คุณรู้วิธีใช้มันโดยใช้โมดอล bootstrap แทนแท็บหรือไม่?. ฉันต้องการความช่วยเหลือจากคุณจริงๆ
cfz

ฉันแนะนำให้ใช้window.resizeดูตัวอย่างlegacy.datatables.net/ref#fnAdjustColumnSizing
KingRider

"aoColumnDefs": [{"sWidth": "10%", "aTargets": [-1]}] ฉันแก้ไขปัญหาของฉันเพียงเพิ่มสิ่งนี้ขอบคุณ
Mina chen

55

คุณจะต้องปรับแต่งตัวแปรสองตัวเมื่อคุณเริ่มต้น dataTables: bAutoWidthและaoColumns.sWidth

สมมติว่าคุณมี 4 คอลัมน์ที่มีความกว้าง 50px, 100, 120px และ 30px คุณจะทำ:

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

สามารถดูข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มต้น dataTables ได้ที่http://datatables.net/usage

ดูการโต้ตอบระหว่างการตั้งค่าของ widhts กับ CSS ที่คุณใช้ คุณอาจแสดงความคิดเห็นเกี่ยวกับ CSS ที่มีอยู่ก่อนที่จะลองทำเพื่อดูว่าคุณเข้าใกล้แค่ไหน


อืม. สิ่งที่คุณกำลังพูดคือนี่เป็นผลมาจาก bAutoWidth: true ทำให้ไม่ได้เป็นตัวเลือกที่ชาญฉลาดโดยเฉพาะอย่างยิ่งสำหรับความกว้างของคอลัมน์
John Mac

นี่คือสิ่งที่ฉันคิด ตารางของฉันจะเด้งไปรอบ ๆ หากข้อมูลมีความยาวไม่สอดคล้องกัน นี่คือเหตุผลที่ฉันใส่พารามิเตอร์ aoColumns และ bAutoWidth
artlung

1
สวย. แก้ไขปัญหาของฉันโดยสิ้นเชิง
ลากูน่า

สุดยอด @Laguna! ชอบฟังคำตอบเก่า ๆ แบบนี้จะเป็นประโยชน์
artlung

1
"bAutoWidth": การทำงานที่ผิดพลาด แต่เป็นเพียงคำถาม เป็นแนวทางปฏิบัติที่ดีหรือไม่หากฉันใส่รายละเอียดความกว้างในแท็ก <th>
finnTheHumin

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

2
นี่คือคำตอบที่ถูกต้องสำหรับฉัน ฉันใช้ boostrap .table-responsive ด้วยการตั้งค่ารหัสที่สามารถระบุข้อมูลได้ซึ่งเป็นความกว้างของตัวเองจึงเข้ามาขวางทาง
mac10688

มาที่นี่เพื่อโพสต์วิธีแก้ปัญหาโง่ ๆ นี้ซึ่งเกี่ยวข้องกับการลบคุณสมบัติความกว้างในเหตุการณ์การเปลี่ยนแปลงแท็บ แต่ดูเหมือนว่าจะได้รับการแก้ไขแล้ว ขอบคุณ. +1
Topher

ฉันมี 3 แท็บและข้อมูลในสองแท็บแรกตารางบนแท็บที่สองไม่เต็มความกว้าง สิ่งนี้ช่วยแก้ปัญหาของฉันได้ ขอบคุณ
Mike Volmar

47

ฉันไม่คุ้นเคยกับปลั๊กอินนั้น แต่คุณสามารถรีเซ็ตรูปแบบหลังจากเพิ่มข้อมูลได้หรือไม่? สิ่งที่ต้องการ

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

หลังจากการเรียก. dataTable?


1
ฉันพบว่านี่เป็นทางออกที่ดีที่สุดเช่นกันเพราะในกรณีของฉันตารางก็ถูกตั้งค่าเป็นความกว้าง 100px เมื่อคอลัมน์ใด ๆ ถูกทำให้มองไม่เห็น - ดูที่นี่: datatables.net/forums/discussion/3417/…
mydoghasworms

นี่คือวิธีแก้ปัญหาที่ได้ผลสำหรับฉัน ช่วยให้สามารถควบคุม css ของตารางข้อมูลได้ดีกว่าเมื่อเทียบกับ oTable.fnAdjustColumnSizing (); โซลูชันที่กล่าวถึงก่อนหน้านี้
Vijay Rumao

11

ฉันมีปัญหามากมายเกี่ยวกับความกว้างของคอลัมน์ของข้อมูล การแก้ไขเวทมนตร์สำหรับฉันรวมถึงเส้น

table-layout: fixed;

css นี้ไปกับ css โดยรวมของตาราง ตัวอย่างเช่นหากคุณได้ประกาศข้อมูลดังต่อไปนี้:

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

จากนั้นสาย magic css จะไปอยู่ในคลาส Loadtable

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

}


2
สิ่งนี้ช่วยได้ แต่ตอนนี้คอลัมน์ของฉันมีขนาดแปลก ๆ ฉันคาดว่าคอลัมน์ที่มีข้อมูลมากที่สุดจะใช้ความกว้างเปอร์เซ็นต์มากที่สุด
cjbarth

7

โซลูชัน TokenMacGuys ทำงานได้ดีที่สุดเนื่องจากนี่เป็นผลมาจากจุดบกพร่องใน jQdataTable จะเกิดอะไรขึ้นถ้าคุณใช้ $ ('# นี่คือการแก้ไขด่วน:

$('#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

เพิ่มคลาส css นี้ในเพจของคุณมันจะแก้ไขปัญหาได้:

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

1
ฉันมีปัญหาแยกต่างหากที่ฉันต่อสู้ในช่วง 30 นาทีที่ผ่านมา - โค้ดบรรทัดนี้แก้ไขแล้ว - ดังนั้นฉันแค่อยากจะขอบคุณสำหรับความคิดเห็นแบบสุ่มนี้
user1274820

1
นี่คือเหตุผลที่ฉันให้คำตอบเพิ่มเติม
Bahadir Tasdemir

5

การตั้งค่าความกว้างอย่างชัดเจนโดยใช้sWidthสำหรับแต่ละคอลัมน์ AND bAutoWidth: falseในการdataTableเริ่มต้นช่วยแก้ปัญหา (ที่คล้ายกัน) ของฉัน รักล้นกอง.


5

คุณต้องออกอย่างน้อยหนึ่งฟิลด์โดยไม่มีฟิลด์คงที่ตัวอย่างเช่น:

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

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

คุณสามารถเปลี่ยนทั้งหมดได้ แต่ปล่อยไว้เพียงอันเดียวเป็นโมฆะจึงจะยืดออกได้ หากคุณใส่ความกว้างทั้งหมดมันจะไม่ทำงาน หวังว่าฉันจะช่วยใครสักคนในวันนี้!


1
สำหรับฉันแล้วฉันตั้งค่าคอลัมน์ทั้งหมดให้มี 1px การปล่อยออกมาทำให้มันทำงานได้อย่างน่าอัศจรรย์ ขอบคุณ!
demoncodemonkey

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

วิธีนี้ใช้ได้ดีในการปรับความกว้างของตารางทั้งหมด ขอบคุณ @Peter Drinnan!


ฉันไม่สามารถทำให้ตารางเติมคอนเทนเนอร์หลักได้อย่างถูกต้อง พยายามปรับ css ของตารางและ wrapper ให้กว้าง: 100%; โดยไม่มีความแตกต่างอย่างเห็นได้ชัด เมื่อฉันลองใช้วิธีดังกล่าวข้างต้นมันได้ผลอย่างมหัศจรรย์ แต่ฉันไม่ได้ชี้ไปที่กระดาษห่อหุ้ม แต่ฉันต้องชี้ไปที่โต๊ะมันเป็นของตัวเอง แต่ขอบคุณมาก Nilani !!
Logic1


3

ไม่มีวิธีแก้ปัญหาใดที่ได้ผลสำหรับฉัน แม้แต่ตัวอย่างในหน้าแรกของดาต้าเบสก็ไม่สามารถใช้งานได้ด้วยเหตุนี้การเริ่มต้นของข้อมูลในตัวเลือกการแสดง

ฉันพบวิธีแก้ปัญหาแล้ว เคล็ดลับคือการใช้ตัวเลือกเปิดใช้งานสำหรับแท็บและเรียกใช้ fnAdjustColumnSizing () บนตารางที่มองเห็นได้ :

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

แค่บอกว่าฉันมีปัญหาเดียวกับคุณแม้ว่าฉันจะใช้ JQuery กับตารางปกติโดยไม่มี Ajax ด้วยเหตุผลบางประการ Firefox จึงไม่ขยายตารางออกไปหลังจากเปิดเผย ฉันแก้ไขปัญหาโดยวางตารางไว้ใน DIV และใช้เอฟเฟกต์กับ DIV แทน


2

คุณกำลังทำสิ่งนี้ในงานพร้อมหรือไม่?

$ (เอกสาร) .ready (ฟังก์ชัน () {... });

การปรับขนาดส่วนใหญ่จะขึ้นอยู่กับเอกสารที่โหลดจนเต็ม


ลองดูโค้ดด้านบน - มันเกิดขึ้นในการเรียกกลับจากโหลด ajax ของ div container # tab-datasets ตาราง #querytable ชุดข้อมูลจัดทำโดย / cgi-bin / qryDatasets
John Mac

ฉันเข้าใจดีฉันไม่แน่ใจเวลาที่จะเกิดขึ้น ในการดูแหล่งที่มาของปลั๊กอินดูเหมือนว่ามีครั้งเดียวที่สามารถตั้งค่าความกว้างของ 0px ได้คือเมื่อไม่สามารถกำหนดตารางที่ถูกต้อง offSetWidth ได้และฉันพบว่าเกี่ยวข้องกับการทำงานเร็วเกินไป
Mufaka

อืม. ฉันสันนิษฐานว่าการเรียกกลับจากการโหลด ajax ถูกเรียกหลังจากโหลดตาราง #querytableDatasets คุณคิดว่าอาจไม่เป็นเช่นนั้นหรือ?
John Mac

BTW เพื่อตอบคำถามของคุณเกี่ยวกับเวลาที่ทำงานมันตอบสนองต่อการที่ผู้ใช้คลิกปุ่ม
John Mac

อืมไม่แน่ใจว่าจะเพิ่มอะไรได้อีก หากเป็นการคลิกปุ่มแสดงว่าเอกสารนั้นโหลดเต็มแล้วและไม่มีเหตุผลที่จะใส่สิ่งนี้ไว้ในเหตุการณ์พร้อม คุณอาจเล่นกับความกว้างของคอนเทนเนอร์ของตารางหรือพยายามให้ (ปลั๊กอิน DataTables) ทำงานนอกเลย์เอาต์ปัจจุบันของคุณ
Mufaka

1

สำหรับใครก็ตามที่มีปัญหาในการปรับความกว้างของตาราง / เซลล์โดยใช้ปลั๊กอินส่วนหัวคงที่:

Datatables อาศัยแท็กแท็กสำหรับพารามิเตอร์ความกว้างของคอลัมน์ เนื่องจากเป็น html ดั้งเดิมเพียงอย่างเดียวเนื่องจาก html ภายในส่วนใหญ่ของตารางได้รับการสร้างขึ้นโดยอัตโนมัติ

อย่างไรก็ตามสิ่งที่เกิดขึ้นคือเซลล์บางส่วนของคุณอาจมีขนาดใหญ่กว่าความกว้างที่เก็บไว้ในเซลล์แอด

กล่าวคือถ้าตารางของคุณมีคอลัมน์จำนวนมาก (ตารางกว้าง) และแถวของคุณมีข้อมูลจำนวนมากการเรียก "sWidth": เพื่อเปลี่ยนขนาดเซลล์ td จะทำงานไม่ถูกต้องเนื่องจากแถวลูกจะปรับขนาด td โดยอัตโนมัติโดยอิงจากโอเวอร์โฟลว์ เนื้อหาและสิ่งนี้เกิดขึ้นหลังจากที่ตารางเริ่มต้นและส่งผ่านพารามิเตอร์เริ่มต้น

พารามิเตอร์ thead "sWidth": ถูกลบล้าง (หด) เนื่องจากข้อมูลคิดว่าตารางของคุณยังคงมีความกว้างเริ่มต้นที่% 100 ซึ่งไม่ทราบว่ามีบางเซลล์ล้น

ในการแก้ไขปัญหานี้ฉันได้หาค่าความกว้างส่วนเกินและคำนวณโดยการปรับขนาดตารางตามหลังจากเริ่มต้นตารางแล้ว - ในขณะที่เราอยู่ที่นั้นเราสามารถเริ่มส่วนหัวคงที่ของเราได้ในเวลาเดียวกัน:

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

1

สร้าง fixedheader ของคุณใน "ความสำเร็จ" ของการโทร ajax ของคุณคุณจะไม่มีปัญหาการจัดตำแหน่งในส่วนหัวและแถว

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

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

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

1

หวังว่านี่จะช่วยคนที่ยังดิ้นรน

อย่าเก็บโต๊ะของคุณไว้ในภาชนะใด ๆ ทำให้กระดาษห่อของตารางเป็นภาชนะของคุณหลังจากที่ตารางแสดงผล ฉันรู้ว่าสิ่งนี้อาจไม่ถูกต้องในสถานที่ที่คุณมีอย่างอื่นพร้อมกับตาราง แต่คุณสามารถต่อท้ายเนื้อหานั้นกลับได้ตลอดเวลา

สำหรับฉันปัญหานี้เกิดขึ้นหากคุณมีแถบด้านข้างและคอนเทนเนอร์ที่เป็นออฟเซ็ตของแถบด้านข้างนั้น

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

(ฉันเพิ่มค่าเริ่มต้นแผงพาเนล)
และชั้นเรียนของคุณ:

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


0

ฉันพบปัญหาคล้าย ๆ กันเมื่อมี div พันรอบโต๊ะ

การเพิ่มตำแหน่ง: ญาติแก้ไขให้ฉัน


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

0

ฉันมีปัญหาคล้ายกันที่เนื้อหาของตารางใหญ่กว่าส่วนหัวและส่วนท้ายของตาราง การเพิ่ม div รอบ ๆ ตารางและการตั้งค่า x-overflow ดูเหมือนจะช่วยแก้ปัญหานี้ได้:


0

ตรวจสอบให้แน่ใจว่าได้ป้อนพารามิเตอร์อื่น ๆ ทั้งหมดก่อน bAutoWidth & aoColumns อย่างถูกต้องพารามิเตอร์ที่ไม่ถูกต้องก่อนหน้านี้จะทำให้ฟังก์ชันนี้เสียหาย


0

ฉันมีปัญหาที่คล้ายกันและพบว่าข้อความในคอลัมน์ไม่แตกและการใช้รหัส css นี้ช่วยแก้ปัญหาได้

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

0

นี่คือวิธีทำของฉัน ..

$('#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

ฉันพบปัญหาเดียวกันในวันนี้

ฉันใช้วิธีที่ยุ่งยากในการแก้ปัญหานี้

รหัสของฉันดังต่อไปนี้

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

0

ตรวจสอบโซลูชันนี้ด้วย สิ่งนี้แก้ไขปัญหาความกว้างคอลัมน์ DataTable ของฉันได้อย่างง่ายดาย

JQuery DataTables 1.10.20 แนะนำcolumns.adjust()วิธีการที่แก้ไขปัญหา Bootstrap toggle tab

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

โปรดดูเอกสารประกอบ: แท็บการเลื่อนและ Bootstrap


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