2009-03-03 85 views
87

Tengo un problema al controlar el ancho de una tabla utilizando el complemento jQuery DataTables. Se supone que la tabla es el 100% del ancho del contenedor, pero termina siendo un ancho arbitrario, algo menor que el ancho del contenedor.jQuery DataTables: ancho de la tabla de control

Sugerencias apreciados

La declaración de tabla es el siguiente

<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 
    }); 
}); ` 

Inspección del HTML en Firebug, verá este (tenga en cuenta el estilo añadido = "width : 0px; ")

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

Al buscar Firebug en los estilos, el estilo table.display ha sido anulado. No se puede ver dónde está viniendo de

element.style { 
    width:0;}  

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

FYI, acabo de encontrar un problema donde una columna no se estaba ajustando correctamente en IE8. El culpable era una imagen que tenía el conjunto de propiedades 'max-width'. A la IE8 aparente 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 a 'ancho' solucionó el problema. –

Respuesta

56

El problema está causado porque dataTable debe calcular su ancho - pero cuando se utiliza dentro de una pestaña, que no es visible, por lo tanto, no puede calcular las anchuras. La solución es llamar a 'fnAdjustColumnSizing' cuando se muestra la pestaña.

Preámbulo

Este ejemplo muestra cómo DataTables con desplazamiento se pueden utilizar juntos con pestañas jQuery interfaz de usuario (o de hecho cualquier otro método por el que la mesa es en un oculto (display: elemento ninguno) cuando está inicializado). El motivo requiere una consideración especial, cuando DataTables es inicializado 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 las columnas al desplazarse está habilitado.

El método para evitar esto es llamar a la función fnAdjustColumnSizing API . Esta función calculará los anchos de columna que son 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 durante el primer tiempo . Para esto, usamos el método 'show' provisto por las tablas jQuery UI. Comprobamos si el DataTable se ha creado o no (observe el selector adicional para 'div.dataTables_scrollBody', esto se agrega cuando se inicializa el DataTable). Si la tabla se ha inicializado, la cambiamos de tamaño. Se podría agregar una optimización para cambiar el tamaño 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 ] } 
     ] 
    }); 
}); 

Ver this para obtener más información.

+1

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

+0

te recomiendo usar 'window.resize', mira un ejemplo https://legacy.datatables.net/ref#fnAdjustColumnSizing – KingRider

42

Bueno, no estoy familiarizado con ese plugin, pero ¿podría restablecer el estilo después de añadir la tabla de datos? Algo como

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

después de la llamada de .dataTable?

+1

También he encontrado que esta es la mejor solución, porque en mi caso, la mesa también estaba configurada con un ancho de 100 píxeles cuando alguna de las columnas se hizo invisible. Consulte aquí: http://www.datatables.net/forums/discussion/3417/table-gets-width0px-when-bvisiblefalse-is-used/p1 – mydoghasworms

+0

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

2

¿Estás haciendo esto en el evento preparado?

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

El dimensionamiento es más probable que va a ser dependiente de documento que se va a plena carga.

+0

tome el código que se ve arriba: está sucediendo en la devolución de llamada desde la carga ajax del div contenedor # tab-datasets. La tabla #querytableDatasets es proporcionada por/cgi-bin/qryDatasets –

+0

Entiendo que no estoy seguro del momento oportuno para que eso suceda. Al observar el origen del complemento, parecía que el único momento en 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 temprana. – Mufaka

+0

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

48

Usted querrá ajustar dos variables al inicializar tablas de datos: bAutoWidth y aoColumns.sWidth

suponiendo que tiene 4 columnas con anchuras de 50 px, 100, 120 píxeles y 30 píxeles puede hacer:

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

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

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

+0

mmm. es lo que estás diciendo es que esto es el resultado de bAutoWidth: true no toma decisiones particularmente inteligentes para el ancho de la columna. –

+0

Esto es lo que creo. Mis tablas rebotan si los datos son inconsistentes en longitud. Es por eso que puse los parámetros aoColumns y bAutoWidth. – artlung

+1

hermoso. solucioné totalmente mi problema – Laguna

38
jQuery('#querytableDatasets').dataTable({ 
     "bAutoWidth": false 
}); 
+1

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

+0

HA, ¡HÉROE ABSOLUTO! –

+0

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 parece que lo ha solucionado. Gracias. +1 – topher

2

Solo para decir que he tenido exactamente el mismo problema que tú, aunque solo he aplicado JQuery a una tabla normal sin ningún 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.

0

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

Posición de adición: relative fixed it for me.


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

Estableciendo los anchos explícitamente usando sWidth para cada columna Y bAutoWidth: false en dataTable la inicialización resolvió mi problema (similar). Amo la pila desbordante.

0

Tuve un problema similar cuando el contenido de la tabla era más grande que el encabezado y el pie de página de la tabla. La adición de un div alrededor de la mesa y el establecimiento de x-desbordamiento parece haberse solucionado este problema:

0

Asegúrese de que todos los parámetros de los demás antes de bAutoWidth & aoColumns son correctamente parámetro incorrecto entered.Any antes se romperá esta funcionalidad.

5

usted tiene 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"}] 
}); 

Usted puede cambiar todo, pero dejar sólo una como nulo, por lo que se puede estirar. Si pone anchos en TODO, no funcionará. ¡Espero haber ayudado a alguien hoy!

+1

Eso fue todo para mí, estaba configurando todas las columnas para tener 1px. Salir de uno lo hizo funcionar mágicamente. ¡Gracias! – demoncodemonkey

-1

Esto funciona bien.

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

Para cualquier persona que tenga problemas para ajustar el ancho de la tabla/célula usando el plugin cabecera fija:

tablas de datos se basa en 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ía 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 thead.

I.e. si su tabla tiene muchas columnas (tabla ancha) y sus filas tienen una gran cantidad de datos, llamar a "sWidth": cambiar el tamaño de la celda td no funcionará correctamente porque las filas secundarias están redimensionando automáticamente las td basadas en contenido desbordado y esto sucede después de la tabla se ha inicializado y ha pasado sus parámetros init.

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

Para solucionar esto me di cuenta de la anchura de desbordamiento y se representaron cambiando el tamaño de la tabla en consecuencia después de la tabla se ha inicializado - ya que estamos en ella podemos init nuestra cabecera fija al mismo tiempo:

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

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 usted ha declarado que las tablas de datos como los siguientes:

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

entonces la línea css magia iría en la clase Loadtable

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

}

+0

Esto ayuda, pero ahora mis columnas son de tamaños extraños. Hubiera esperado que las columnas con más datos tomarían el mayor porcentaje de ancho. – cjbarth

0

que tenía el mismo problema y encontré ese texto en las columnas no se rompe y con este código CSS resuelto el problema

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

La solución TokenMacGuys funciona mejor porque es el resultado de un error en jQdataTable. Lo que sucede es que si usas $ ('# sometata'). DataTable(). FnDestroy() el ancho de la tabla se establece en 100px en lugar de 100%. Aquí es 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%"); 
     } 

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

Esto funcionó bien para ajustar toda la anchura de la tabla. Gracias @ Peter Drinnan!

+0

No pude obtener la tabla para llenar correctamente su contenedor principal. Intentó ajustar css de la mesa y su envoltura al ancho: 100%; sin diferencia notable. Una vez que probé el método mencionado anteriormente funcionó de maravillas, sin embargo, no estoy apuntando a la envoltura, en su lugar tuve que apuntar a la mesa en sí misma. Pero muchas gracias Nilani !! – Logic1

3

Ninguna de las soluciones aquí funcionó para mí. Incluso el ejemplo en el datatables homepage no funcionó, por lo tanto, a la inicialización de la tabla de datos en la opción show.

Encontré una solución al problema. El truco está en utilice la opción Activar para las pestañas y para fnAdjustColumnSizing llamada() en la tabla visibles:

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

}); 
1

crear su FixedHeader dentro del "éxito" de la llamada Ajax, que no tendrá ningún problema de alineación en el encabezado y filas.

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

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

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

Esta es mi manera 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' } 
    ] 
}); 
1

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

No guarde la mesa dentro de ningún contenedor. Convierta la envoltura de la mesa en su contenedor después de que se represente la tabla. Sé que esto podría no ser válido en los lugares donde tienes algo más junto con la mesa, pero luego siempre puedes volver a agregar ese contenido.

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

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

(que añade un panel del panel predeterminada)
Y tu clase:

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

Añadir esta clase CSS a la página, se solucionará el problema:

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

Tuve un problema diferente con el que estuve luchando durante los últimos 30 minutos, esta línea de código lo solucionó, así que solo quería dar las gracias por este comentario aleatorio. – user1274820

+1

Es exactamente por eso que doy respuestas adicionales – webmaster

1

encontrar otro enlace útil sobre este problema y resolvió mi problema.

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

Datatables force width table

+1

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ review/low-quality-posts/13362323) –

+0

@ahmadaghazadeh ya publica el código. –

0

me encuentro con el mismo problema hoy en día.

Utilicé una forma complicada de resolverlo.

Mi código como a continuación.

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