Как динамически изменить Datatables для нескольких заголовков столбцов, используя ajax и jquery, не обновляя веб-страницу?
Я пытаюсь изменить номер столбца и заголовок в соответствии с возвращаемым значением ajax, в то время как данные таблицы обновляются с помощью плагина Dataquables jquery. Javascript и JQuery код ниже:
$( document ).ready(function() {
$.ajax({
type:'POST',
url: 'readtitle.php', //this php contains the column header
success:function(re){
setTitle(re); // this function is used to set column header
}
});
var oTable = $('#table_id').dataTable({
"bPaginate": false,
"bProcessing": true,
"bLengthChange": true,
"bFilter": true,
"bRetrieve": true,
"bInfo": false,
"bAutoWidth": false,
"bServerSide": true,
"sDom": '<"top"iflp<"clear">>rt<"bottom"iflp<"clear">>',
"aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]],
"sAjaxSource": './aadata.txt',
"aoColumnDefs": [
{"aTargets":[]}
]
});
}
function setTitle(re){
re = re.substring(0,re.length-1);
var retitle = re.split(","); // this retitle can be of length 3 to 6, depends on the data
$(retitle).each(function(index, element){
$('#titleh').html(element);
});
}
Ниже моя HTML-таблица:
<table id="table_id" class="display">
<thead>
<tr id="titler"><th>Date</th><th>Actual</th>
<th id="titleh"></th>
</tr>
</thead>
<tbody>
<tr>
<td>Row 1 Data 1</td>
<td>Row 1 Data 2</td>
</tr>
</tbody>
</table>
Потому что в HTML я установил 3 заголовка. Если возвращаемый заголовок имеет длину 3, он работает нормально. Однако, если длина изменяется, функция (возможно, неправильная):
$(retitle).each(function(index, element){
$('#titleh').html(element);
});
возвращает только последний элемент, в результате чего номер столбца таблицы фиксируется на 3. Я не знаю, как увеличить заголовок столбца с помощью цикла в jQuery.
Я застрял на два дня. Кто-нибудь может мне помочь, пожалуйста!
Большое спасибо!!!
Кэти
3 ответа
Я решил этот вопрос, изменив способ инициализации таблицы в HTML вместо изменения настроек в Datatables.
Я сделал следующее: сначала удалите существующую таблицу, а также обертку таблицы!
$('#table_id').remove();
$('#table_id_wrapper').remove();
Затем инициализируйте новую таблицу. и установите формат заголовка / тела в соответствии с вашими данными:
var content = "<table id='table_id' class='display datatable' style='width:100%;'><thead>";
content +='<tr>';
re = re.substring(0,re.length-1);
// alert(re);
var retitle = re.split(",");
alert (retitle + 'x');
var c = retitle.length;
var atarget = [];
var stitle = [];
for(var i=0; i<c; i++){
atarget[i] = i;
stitle[i] = retitle[i];
content += '<td>' +retitle[i] + '</td>';
}
content +=' </tr></thead>';
content +='<tbody></tbody>'
content += "</table>";
Затем добавьте свою таблицу к своей веб-странице. Здесь я прикрепил его к моей вкладке:
$('#tab3').append(content);
Наконец, я инициализировал настройки Datatable, изменив aoColumnDef в соответствии с моими собственными данными. Отмечено, что формат данных должен соответствовать тому, как вы ранее определяли свою таблицу HTML
var settings = {
"bPaginate": false,
"bProcessing": true,
"bLengthChange": true,
"bFilter": false,
"bInfo": false,
"bAutoWidth":false,
"bServerSide": true,
// "sDom": '<"top"iflp<"clear">>rt<"bottom"iflp<"clear">>',
"aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]],
"sAjaxSource": './aadata.txt',
"aoColumnDefs": [
{ "aTargets":atarget}
]
};
$('#table_id').dataTable().fnDestroy();
$('#table_id').dataTable(settings);
$('#table_id').dataTable().fnReloadAjax();
Кстати, спасибо @CodingAnt, @JerryDDG все равно за вашу помощь.
Связанный вопрос об изменении заголовка Datatable решается здесь:
Какой правильный формат для изменения столбца Datatables с помощью массива?
Возможно, вам следует уничтожить старую таблицу и создать новую с новым конфигом.
$(tableSelector)
.dataTable(dataTable_setting)
.fnAddData(data);
$.ajax({
url: ...
data: ...
success: function(data) {
if (columns number changed) {
$(tableSelector).empty();
$(tableSelector)
.dataTable(newDataTable_setting)
.fnAddData(newData);
}
}
})
Я не слишком уверен в этом, на самом деле ваше требование до сих пор не ясно для меня.
В случае, если это правильно, вам нужно немного настроить в соответствии с вашими требованиями. Его добавление заголовка, если это необходимо.
<script type="text/javascript">
function setTitle(re){
re = re.substring(0,re.length-1);
var retitle = re.split(",");
//destroy element created on request
$('th').each(function(index, element)
{
if(index > 2)
{
$( this ).remove();
}
});
//For extra header if any
if(retitle.length > 1)
{
for (var i = 1; i <= retitle.length; i++)
{
$('#titler').append('<th></th>');
};
}
var counter = 0;
$('th').each(function(index, element)
{
if(index > 1)
{
$( this ).text(retitle[counter]);
counter ++;
}
});
}
</script>