2009-03-03 13 views
87

У меня проблема с управлением шириной таблицы с помощью плагина jQuery DataTables. Предполагается, что таблица должна быть на 100% от ширины контейнера, но заканчивается произвольной шириной, а не шириной контейнера.jQuery Таблицы данных: ширина таблицы управления

Предложения оценили

Декларация таблица выглядит следующим образом

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

инспектирующих HTML в Firebug, вы видите это (обратите внимание на добавленную стиль = "ширина : 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%; 
} 
+0

FYI, я только что столкнулся с проблемой, когда колонка неправильно корректировалась в IE8. Преступником был образ, обладающий набором свойств max-width. Очевидно, что IE8 не слишком любит это свойство и игнорирует его по отношению к данным, хотя изображение имеет размер корреляции на экране. Изменение его на 'width' устранило проблему. –

ответ

56

Проблема вызвана тем, что DataTable должен вычислить его ширину - но при использовании внутри вкладки, он не виден, следовательно, не может рассчитать ширину. Решение заключается в вызове «fnAdjustColumnSizing», когда отображается вкладка.

преамбула

В этом примере показано, как DataTables с прокруткой могут быть использованы вместе с помощью вкладок JQuery UI (или действительно любой другой способ, в котором таблица находится в скрытой (дисплей : элемент, когда ни один) он инициализируется). Причина, почему требует особого рассмотрения, заключается в том, что когда DataTables имеет значение , и он находится в скрытом элементе, браузер не имеет любых измерений, с помощью которых можно предоставить DataTables, и это потребует в смещении столбцов при прокрутке включен.

Метод, чтобы обойти это, вызвать функцию fnAdjustColumnSize API . Эта функция рассчитает ширину столбцов, которая составляет , необходимую на основе текущих данных, а затем перерисует таблицу - это именно то, что необходимо, когда таблица становится видимой для первого времени. Для этого мы используем метод show, предоставляемый таблицами 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 ] } 
     ] 
    }); 
}); 

Смотрите this для получения дополнительной информации.

+1

У меня также есть такая же проблема с @John McC, однако я применил свои данные к модальному, я использую bootstrap, и я застрял в этой проблеме .. вы знаете, как реализовать его, используя bootstrap modal вместо вкладки? .. Мне действительно нужна ваша помощь – cfz

+0

Я рекомендую использовать 'window.resize', посмотрите пример https://legacy.datatables.net/ref#fnAdjustColumnSizing – KingRider

42

Ну, я не знаком с этим плагином, но вы могли бы сбросить стиль после добавления DataTable? Что-то вроде

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

после вызова .dataTable?

+1

Я нашел это лучшим решением, потому что в моем случае таблица также была установлена ​​на ширину 100 пикселей, когда любой из столбцов был невидимым - см. Здесь: http://www.datatables.net/forums/discussion/3417/table-gets-width0px-when-bvisiblefalse-is-used/p1 – mydoghasworms

+0

Это решение, которое сработало для меня. он дает более тонкий контроль над css таблицы данных по сравнению с oTable.fnAdjustColumnSize(); решение, упомянутое ранее. –

2

Вы делаете это в готовом мероприятии?

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

Размеры, скорее всего, будут зависеть от полной загрузки документа.

+0

возьмите код, смотри выше - это происходит в обратном вызове из загрузки ajax контейнеров-контейнеров # контейнера div. Таблица #querytableDatasets предоставляется/cgi-bin/qryDatasets –

+0

Я понимаю, что я не уверен в сроках для этого. При взгляде на источник плагина казалось, что единственный раз, когда он может установить ширину 0px, это когда он не мог определить правильную таблицу offSetWidth, и я подумал, что это связано с запуском слишком рано. – Mufaka

+0

hmm. Я предположил, что обратный вызов из нагрузки ajax вызывается после загрузки таблицы #querytableDatasets. вы думаете, что это может быть не так? –

48

Вы хотите настроить две переменные при инициализации 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, прежде чем пытаться это увидеть, насколько вы близки.

+0

ммм. это то, что вы говорите, это то, что это результат bAutoWidth: true делает не особенно разумным выбор ширины столбца. –

+0

Вот что я думаю. Мои таблицы отскакивают, если данные непоследовательны по длине. Вот почему я ввел параметры aoColumns и bAutoWidth. – artlung

+1

красивый. полностью исправил мою проблему. – Laguna

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

Это был правильный ответ для меня. Я использую boostrap .table-отзывчивый. С установкой типа данных, имеющей собственную ширину, она мешает. – mac10688

+0

HA, ABSOLUTE HERO! –

+0

Пришел сюда, чтобы опубликовать мое решение этой глупой проблемы, которая включала удаление свойства ширины на событии изменения вкладки, но это, похоже, исправило это. Благодарю. +1 – topher

2

Просто сказать, что я была точно такая же проблема, как и ты, хотя я был просто применить JQuery к обычной таблицы без Ajax. По какой-то причине Firefox не раскрывает таблицу после ее раскрытия. Я исправил проблему, поставив таблицу внутри DIV и применив эффекты к DIV.

0

У меня возникла аналогичная проблема, когда у меня был обернутый div.

Добавление позиции: относительная фиксированная для меня.


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

Установка ширины явно с использованием sWidth для каждой колонки И bAutoWidth: false в dataTable Инициализация решена моя (аналогичная) проблема. Любите переполненный стек.

0

У меня была аналогичная проблема, когда содержимое таблицы было больше, чем верхний и нижний колонтитулы. Добавление DIV вокруг стола и полагая й переполнение, кажется, сортировал этот вопрос:

0

Убедитесь, что все другие параметрами перед bAutoWidth & aoColumns являются правильно entered.Any неправильный параметр, прежде чем сломается этой функциональностью.

5

Вы должны оставить по крайней мере одно поле без фиксированного поля, например:

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

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

Вы можете изменить все, но оставить только один, как нулевой, так что он может растягиваться. Если вы установите ширину на ВСЕ, это не сработает. Надеюсь, я помог кому-то сегодня!

+1

Это было для меня, я устанавливал все столбцы 1px. Оставляя одно из них, он волшебным образом работал. Благодаря! – demoncodemonkey

-1

Это прекрасно работает.

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

Для тех, кто возникли проблемы регулировки ширины таблицы/ячейки, используя фиксированный плагин заголовка:

DataTables опирается на THEAD теги для параметров ширины столбца.Это потому, что его действительно единственный собственный html, поскольку большая часть внутреннего html таблицы генерируется автоматически.

Однако, что происходит, некоторые из вашей ячейки могут быть больше ширины, хранящейся внутри ячеек.

I.e. если в таблице много столбцов (широкая таблица), а в ваших строках много данных, тогда вызов «sWidth»: изменение размера ячейки td не будет работать должным образом, поскольку дочерние строки автоматически изменяют размер td на основе содержимого переполнения и это происходит после таблица была инициализирована и передана ее параметрами init.

Оригинал thead «sWidth»: параметры получают переопределенные (сжатые), так как данные таблицы полагают, что ваша таблица по-прежнему имеет ширину по умолчанию% 100 - она ​​не распознает, что некоторые ячейки переполнены.

Чтобы исправить это, я понял, ширину перелива и составил для него путем изменения размера таблицы соответственно после таблицы инициализирована - в то время как мы на это мы можем инициализировать наш фиксированный заголовок в то же время:

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

У меня было много проблем с шириной столбцов в столбцах. Волшебное исправление для меня включало в себя строку

table-layout: fixed; 

этот css идет с общим css таблицы. Например, если вы объявили о DataTables, как следующее:

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

то магия CSS линия будет идти в классе Loadtable

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

}

+0

Это помогает, но теперь мои столбцы странные. Я бы ожидал, что столбцы с наибольшим количеством данных будут иметь наибольшую процентную ширину. – cjbarth

0

я имел подобную проблему и нашел что текст в столбцах не прерывается, и с использованием этого кода css решена проблема

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

Решение TokenMacGuys работает лучше всего, потому что это результат ошибки в jQdataTable. Что происходит, если вы используете $ ('# sometabe'). DataTable(). FnDestroy() ширина таблицы устанавливается равной 100px вместо 100%. Вот быстрое решение:

$('#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%"); 
} 

Это работало отлично, чтобы настроить всю ширину таблицы. Спасибо @Peter Drinnan!

+0

Я не мог заставить таблицу правильно заполнить родительский контейнер. Пробовал настройку css таблицы и ее обертки до ширины: 100%; без заметной разницы. Как только я попробовал вышеупомянутый метод, он работал чудесами, однако я не указывал на обертку, вместо этого я должен был указывать на таблицу, это сам. Но большое спасибо Нилани! – Logic1

3

Ни одно из решений здесь не работало для меня. Даже пример на datatables homepage не сработал, следовательно, для инициализации datatable в опции show.

Я нашел решение проблемы. Хитрость заключается в том, чтобы использовать опцию реактивировать для вкладок и вызова 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); 

}); 
1

создать fixedheader внутри «успеха» вашего АЯКС вызова, вы не будете иметь никаких проблем выравнивания в заголовке и строках.

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

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

     new $.fn.dataTable.FixedHeader(table); 
}   
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' } 
    ] 
}); 
1

Надеется, что это поможет кому-то, кто все еще борется.

Не держите стол в контейнере. Сделайте оболочку таблицы контейнером после рендеринга таблицы. Я знаю, что это может быть недействительным в тех местах, где у вас есть что-то еще вместе с таблицей, но тогда вы всегда можете добавить этот контент обратно.

Для меня эта проблема возникает, если у вас есть боковая панель и контейнер, который на самом деле является смещением этой боковой панели.

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

(я добавил панель панель-умолчанию)
И ваш класс:

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

Добавить этот класс CSS на страницу, она будет решить проблему:

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

У меня была отдельная проблема, с которой я боролся последние 30 минут - эта строка исправила ее, поэтому я просто хотел сказать спасибо за этот случайный комментарий. – user1274820

+1

Именно поэтому я даю дополнительные ответы – webmaster

1

найти другую полезную ссылку об этой проблеме, и она решила мою проблему.

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

Datatables force width table

+1

Хотя эта ссылка может ответить на вопрос, лучше включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/13362323) –

+0

@ahmadaghazadeh уже опубликовал код. –

0

я встретиться с той же проблемой сегодня.

Я использовал сложный способ решить эту проблему.

Мой код, как показано ниже.

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