jQuery DataTables:控制表格宽度

108

我在使用jQuery DataTables插件时,无法控制表格的宽度。表格应该是容器宽度的100%,但最终的宽度是任意的,并且相对于容器宽度要小。

欢迎提出建议。

表格声明代码如下:

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

同时还有JavaScript代码:

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

在 Firebug 中检查 HTML,你会看到这样的内容(注意添加了 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%;  
}  

我刚遇到一个问题,IE8中的某一列没有正确调整。罪魁祸首是一个设置了max-width属性的图像。显然,IE8不太喜欢这个属性,并在与datatables相关时忽略了它,即使图像在屏幕上大小正确。将其更改为width解决了问题。 - John B
https://dev59.com/6WQm5IYBdhLWcg3w6SdR#46160726 - Frank Myat Thu
26个回答

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

调整整个表格宽度时这很有效。感谢 @Peter Drinnan!


我无法使表格正确填充其父容器。尝试调整表格及其包装器的CSS为width:100%;,但没有明显的差异。一旦我尝试了上述方法,它就奏效了,但是我并不是指向包装器,而是必须指向表格本身。非常感谢Nilani!! - Logic1

3

也可以尝试这个解决方案。这个方法能够轻松解决我的DataTable列宽问题。

JQuery DataTables 1.10.20引入了columns.adjust()方法,可以解决Bootstrap切换选项卡的问题。

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

请参考文档:滚动和Bootstrap选项卡

这个解决方案应该是最新的,对我起作用了。 - Gaurav Chavan

3

这里的解决方案都不适用于我。即使是在 datatables 主页上的示例,也无法正常工作,因为在展示选项中初始化了表格。

我找到了一个解决方案。诀窍是使用选项卡中的 activate 选项,并在可见表格上调用 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

你是在ready事件中执行这个操作吗?

$(document).ready(function() { ... });

元素的尺寸很可能取决于文档是否完全加载。


看一下上面的代码 - 它是在从div容器#tab-datasets的ajax加载的回调中发生的。表格#querytableDatasets由/cgi-bin/qryDatasets提供。 - John Mac
我理解这一点,但我不确定它发生的时间。查看插件源代码时,似乎唯一可能设置0像素宽度的时候是无法确定正确的表格offSetWidth,我想这与运行时间过早有关。 - Mufaka
嗯,我假设ajax加载的回调函数在表格#querytableDatasets加载完之后被调用。你认为这可能不是这种情况吗? - John Mac
顺便回答一下你关于这个程序何时运行的问题,它是在用户点击按钮后响应的。 - John Mac
嗯,我不确定我能再添加什么了。如果这是一个按钮点击事件,那么文档已经完全加载,没有理由将其放在准备事件中。您可以尝试调整表格容器的宽度或尝试让DataTables插件在当前布局之外工作。 - Mufaka

2

仅仅想说我和你遇到的问题一模一样,尽管我只是将JQuery应用于一个普通表格而没有使用任何Ajax。由于某种原因,Firefox在揭示表格后不会展开它。我通过将表格放置在DIV中,并将效果应用于DIV来解决了这个问题。


1

在您的ajax调用的“success”中创建固定标题,您将不会在标题和行中遇到任何对齐问题。

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

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

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

1

我找到了另一个关于这个问题的有用链接,它解决了我的问题。

<table width="100%">
<tr>
    <td width="20%"> Left TD <td>
    <td width="80%"> Datatable </td>
</tr>
</table>

Datatables 强制宽度表格


1
希望这能帮助那些仍在苦苦挣扎的人。
不要将表格放在任何容器中。在表格渲染后,将表格的包装器作为您的容器。我知道在您与表格一起有其他内容的地方可能无效,但是您总是可以将该内容附加回来。
对我而言,如果您有侧边栏和实际上是该侧边栏的偏移量的容器,则会出现此问题。
$(YourTableName+'_wrapper').addClass('mycontainer');

我添加了一个面板 panel-default
而您的类:

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

1

对于那些在使用固定标题插件时调整表格/单元格宽度遇到问题的人:

Datatables依赖于thead标签来确定列宽参数。这是因为大多数表格的内部html都是自动生成的,所以这是唯一的本地html。

然而,有些单元格可能比存储在thead单元格中的宽度要大。

例如,如果您的表格有很多列(宽表格)且行数据很多,则调用“sWidth”来更改td单元格大小将无法正常工作,因为子行会根据溢出内容自动调整td大小,并且这是在表格被初始化并传递其初始化参数之后发生的。

原始的thead“sWidth”参数被覆盖(缩小),因为datatables认为您的表格仍具有其默认宽度100%-它没有意识到某些单元格已经溢出。

为了解决这个问题,我找出了溢出宽度,并相应地调整了表格的大小,在表格被初始化后进行处理-同时我们可以同时初始化我们的固定标题:

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

0

当我在表格周围包裹一个div时,遇到了类似的问题。

添加position: relative对我有帮助。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接