jQuery DataTables: ancho de la tabla de control


98

Tengo un problema para controlar el ancho de una tabla usando el complemento jQuery DataTables. Se supone que la mesa tiene el 100% del ancho del contenedor, pero termina siendo un ancho arbitrario, bastante menor que el ancho del contenedor.

Sugerencias apreciadas

La declaración de la tabla se ve así

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

Y el javascript

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

Al inspeccionar el HTML en Firebug, verá esto (tenga en cuenta el estilo agregado = "ancho: 0px;")

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

Mirando en Firebug los estilos, el estilo table.display ha sido anulado. No puedo ver de donde viene esto

element.style {  
  width:0;}    

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

Para su información, acabo de encontrar un problema en el que una columna no se ajustaba correctamente en IE8. El culpable fue una imagen que tenía la max-widthpropiedad configurada. Aparentemente a IE8 no le gusta demasiado esa propiedad y la ignoró en relación con las tablas de datos, a pesar de que la imagen tenía el tamaño correcto en la pantalla. Cambiarlo para widthsolucionar el problema.
John Bubriski

Respuestas:


61

El problema se debe a que dataTable debe calcular su ancho, pero cuando se usa dentro de una pestaña, no es visible, por lo que no se pueden calcular los anchos. La solución es llamar a 'fnAdjustColumnSizing' cuando se muestra la pestaña.

Preámbulo

Este ejemplo muestra cómo las tablas de datos con desplazamiento se pueden usar junto con las pestañas de la interfaz de usuario de jQuery (o de hecho, cualquier otro método mediante el cual la tabla esté en un elemento oculto (mostrar: ninguno) cuando se inicializa). La razón por la que esto requiere una consideración especial, es que cuando se inicializa DataTables y está en un elemento oculto, el navegador no tiene ninguna medida con la que dar DataTables, y esto requerirá en la desalineación de columnas cuando el desplazamiento está habilitado.

El método para evitar esto es llamar a la función de API fnAdjustColumnSizing. Esta función calculará los anchos de columna necesarios en función de los datos actuales y luego volverá a dibujar la tabla, que es exactamente lo que se necesita cuando la tabla se vuelve visible por primera vez. Para esto usamos el método 'show' proporcionado por las tablas de jQuery UI. Verificamos si la DataTable se ha creado o no (observe el selector adicional para 'div.dataTables_scrollBody', esto se agrega cuando se inicializa la DataTable). Si la tabla se ha inicializado, la redimensionamos. Se podría agregar una optimización para cambiar el tamaño solo de la primera muestra de la tabla.

Código de inicialización

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

Vea esto para más información.


1
También tengo el mismo problema con @John McC, sin embargo, apliqué mi tabla de datos a un modal, estoy usando bootstrap y me quedé atascado con este problema ... ¿sabes cómo implementarlo usando bootstrap modal en lugar de pestañas? .Realmente necesito tu ayuda
cfz

recomiendo usar window.resize, mira un ejemplo legacy.datatables.net/ref#fnAdjustColumnSizing
KingRider

"aoColumnDefs": [{"sWidth": "10%", "aTargets": [-1]}]. Solucioné mi problema, solo agregue esto, gracias.
Mina Chen

55

Querrá modificar dos variables cuando inicialice las tablas de datos: bAutoWidthyaoColumns.sWidth

Suponiendo que tiene 4 columnas con anchos de 50px, 100, 120px y 30px, haría:

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

Puede encontrar más información sobre la inicialización de tablas de datos en http://datatables.net/usage

Esté atento a la interacción entre esta configuración de widhts y el CSS que está aplicando. Puede comentar su CSS existente antes de intentar esto para ver qué tan cerca se acerca.


mmm. Lo que está diciendo es que esto es el resultado de bAutoWidth: true haciendo elecciones no particularmente inteligentes para el ancho de columna.
John Mac

Esto es lo que creo. Mis tablas rebotan si la longitud de los datos es inconsistente. Es por eso que puse los parámetros aoColumns y bAutoWidth.
artlung

1
hermoso. totalmente solucionado mi problema.
Laguna

Increíble @Laguna! Me encanta escuchar que viejas respuestas como esta siguen siendo útiles.
artlung

1
"bAutoWidth": falso funciona. Pero solo una pregunta. ¿Es una buena práctica o no poner detalles de ancho en mis etiquetas <th>?
finnTheHumin

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

2
Esta fue la respuesta correcta para mí. Estoy usando boostrap .table-responsive. Con el código de la tabla de datos configurando su propio ancho, se interpone en el camino.
mac10688

Vine aquí para publicar mi solución a este estúpido problema que implicaba eliminar la propiedad de ancho en el evento de cambio de pestaña, pero esto parece haberlo solucionado. Gracias. +1
Topher

Tengo 3 pestañas y tablas de datos en las dos primeras pestañas, la tabla en la segunda pestaña no tenía el ancho completo. esto solucionó mi problema. gracias
Mike Volmar

47

Bueno, no estoy familiarizado con ese complemento, pero ¿podrías restablecer el estilo después de agregar la tabla de datos? Algo como

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

después de la llamada .dataTable?


1
Descubrí que esta también es la mejor solución, porque en mi caso, la tabla también se estaba configurando con un ancho de 100px cuando cualquiera de las columnas se hizo invisible - vea aquí: datatables.net/forums/discussion/3417/…
mydoghasworms

Esta es la solución que funcionó para mí. da un control más preciso sobre el CSS de la tabla de datos en comparación con oTable.fnAdjustColumnSizing (); solución mencionada anteriormente.
Vijay Rumao

11

He tenido numerosos problemas con los anchos de columna de las tablas de datos. La solución mágica para mí fue incluir la línea

table-layout: fixed;

este CSS va con el CSS general de la tabla. Por ejemplo, si ha declarado las tablas de datos como las siguientes:

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

entonces la línea css mágica iría en la clase Loadtable

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

}


2
Esto ayuda, pero ahora mis columnas tienen tamaños extraños. Hubiera esperado que las columnas con la mayor cantidad de datos tuvieran el mayor porcentaje de ancho.
cjbarth

7

La solución TokenMacGuys funciona mejor porque es el resultado de un error en jQdataTable. Lo que sucede es que si usa $ ('# sometabe'). DataTable (). FnDestroy () el ancho de la tabla se establece en 100px en lugar de 100%. Aquí hay una solución rápida:

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

Agregue esta clase css a su página, solucionará el problema:

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

1
Tuve un problema separado con el que he estado luchando durante los últimos 30 minutos, esta línea de código lo solucionó, así que solo quería agradecer este comentario aleatorio.
user1274820

1
Esta es exactamente la razón por la que doy respuestas adicionales
Bahadir Tasdemir

5

Establecer anchos explícitamente usando sWidthpara cada columna Y bAutoWidth: falseen la dataTableinicialización resolvió mi problema (similar). Me encanta la pila desbordante.


5

Tienes que dejar al menos un campo sin campo fijo, por ejemplo:

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

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

Puede cambiar todo, pero dejar solo uno como nulo, para que se pueda estirar. Si pones anchos en TODOS, no funcionará. ¡Espero haber ayudado a alguien hoy!


1
Eso fue todo para mí, estaba configurando todas las columnas para que tuvieran 1px. Dejar uno lo hizo funcionar mágicamente. ¡Gracias!
demoncodemonkey

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

Esto funcionó bien para ajustar todo el ancho de la mesa. ¡Gracias @Peter Drinnan!


No pude hacer que la mesa llenara correctamente su contenedor principal. Intenté ajustar el CSS de la tabla y su envoltorio al ancho: 100%; sin diferencia notable. Una vez que probé el método mencionado anteriormente, funcionó de maravilla, sin embargo, no estoy apuntando al contenedor, en su lugar, tuve que señalar la tabla en sí. Pero muchas gracias Nilani !!
Logic1


3

Ninguna de las soluciones aquí funcionó para mí. Incluso el ejemplo en la página de inicio de las tablas de datos no funcionó, por lo tanto, la inicialización de la tabla de datos en la opción mostrar.

Encontré una solución al problema. El truco consiste en usar la opción de activación para las pestañas y llamar a fnAdjustColumnSizing () en la tabla visible :

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

Solo para decir que tuve exactamente el mismo problema que usted, aunque solo estaba aplicando JQuery a una tabla normal sin Ajax. Por alguna razón, Firefox no expande la tabla después de revelarla. Solucioné el problema colocando la tabla dentro de un DIV y aplicando los efectos al DIV en su lugar.


2

¿Estás haciendo esto en el evento listo?

$ (documento). listo (función () {...});

Es muy probable que el tamaño dependa de que el documento esté completamente cargado.


eche un vistazo al código de arriba: está sucediendo en la devolución de llamada de la carga ajax del contenedor div # tab-datasets. La tabla #querytableDatasets es proporcionada por / cgi-bin / qryDatasets
John Mac

Entiendo eso, no estoy seguro del momento para que eso suceda. Al mirar la fuente del complemento, parecía que la única vez que podía establecer un ancho de 0px era cuando no podía determinar la tabla correcta offSetWidth y pensé que estaba relacionado con la ejecución demasiado pronto.
Mufaka

hmm. Supuse que la devolución de llamada de la carga ajax se llama después de que se cargue la tabla #querytableDatasets. ¿Crees que este puede no ser el caso?
John Mac

Por cierto, para responder a su pregunta sobre cuándo se ejecuta, es en respuesta a que el usuario hace clic en un botón
John Mac

Hmm, no estoy seguro de poder agregar algo más entonces. Si hace clic en un botón, entonces el documento está completamente cargado y no hay razón para ponerlo en el evento listo. Puede jugar con el ancho del contenedor de la tabla o intentar que su (complemento DataTables) funcione fuera de su diseño actual.
Mufaka

1

Para cualquiera que tenga problemas para ajustar el ancho de la tabla / celda usando el complemento de encabezado fijo:

Datatables se basa en las etiquetas thead para los parámetros de ancho de columna. Esto se debe a que es realmente el único html nativo, ya que la mayor parte del html interno de la tabla se genera automáticamente.

Sin embargo, lo que sucede es que parte de su celda puede ser más grande que el ancho almacenado dentro de las celdas de la cabeza.

Es decir, si su tabla tiene muchas columnas (tabla ancha) y sus filas tienen muchos datos, entonces llamar a "sWidth": para cambiar el tamaño de celda td no funcionará correctamente porque las filas secundarias cambian automáticamente el tamaño de los td según el desbordamiento content y esto sucede después de que la tabla se haya inicializado y pasado sus parámetros de inicio.

El thead original "sWidth": los parámetros se anulan (encogen) porque las tablas de datos piensan que su tabla todavía tiene su ancho predeterminado de% 100 - no reconoce que algunas celdas están desbordadas.

Para solucionar esto, descubrí el ancho de desbordamiento y lo tomé en cuenta cambiando el tamaño de la tabla en consecuencia después de que se haya inicializado; mientras estamos en eso, podemos iniciar nuestro encabezado fijo al mismo tiempo:

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

1

cree su Fixedheader dentro del "éxito" de su llamada ajax, no tendrá ningún problema de alineación en el encabezado y las filas.

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

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

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

1

Espero que esto ayude a alguien que todavía está luchando.

No guarde su mesa dentro de ningún recipiente. Haga que el envoltorio de la tabla sea su contenedor después de que la tabla esté renderizada. Sé que esto podría no ser válido en lugares donde tiene algo más junto con la tabla, pero siempre puede agregar ese contenido.

Para mí, este problema surge si tiene una barra lateral y un contenedor que en realidad es un desplazamiento de esa barra lateral.

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

(Agregué un panel de panel predeterminado)
Y su clase:

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


0

Me encontré con un problema similar al tener un div envuelto alrededor de la mesa.

Agregar posición: relativo lo arregló para mí.


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

0

Tuve un problema similar en el que el contenido de la tabla era más grande que el encabezado y el pie de página de la tabla. Agregar un div alrededor de la mesa y configurar x-overflow parece haber solucionado este problema:


0

Asegúrese de que todos los demás parámetros anteriores a bAutoWidth & aoColumns se hayan ingresado correctamente. Cualquier parámetro incorrecto anterior romperá esta funcionalidad.


0

Tuve un problema similar y descubrí que el texto en las columnas no se rompe y el uso de este código css resolvió el problema

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

0

Esta es mi forma de hacerlo ..

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

Hoy encuentro el mismo problema.

Usé una forma complicada de resolverlo.

Mi código de la siguiente manera.

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

0

Compruebe también esta solución. esto resolvió mi problema de ancho de columna de DataTable fácilmente

JQuery DataTables 1.10.20 presenta un columns.adjust()método que soluciona el problema de la pestaña de alternancia de Bootstrap

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

Consulte la documentación: Pestañas de desplazamiento y Bootstrap


-1

Esto funciona bien.

#report_container {
   float: right;
   position: relative;
   width: 100%;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.