Как сделать доступным числовую строку или ячейку?
Я работаю над развитием истории конкретного пользователя, и я хочу, чтобы это было сделано с помощью dataTables. Однако я не могу найти способ, с помощью которого я могу сделать свою строку или конкретную ячейку доступной. Мне нужно открыть отдельные ссылки с отдельными кликами для определенной строки. Любая помощь будет оценена по достоинству. Заранее спасибо !!!
Отредактировано :: Если я нажимаю на строку, мне нужны все данные строки, что не является проблемой. Я могу это сделать. Что мне нужно знать, так это сделать запрос $.ajax() с данными конкретной строки. Я думаю, что это будет сделано. Однако было бы замечательно узнать, как открыть ссылку на новой вкладке при щелчке по строке.
$(document).ready(function() {
var dataSet = [
[]
];
$.ajax({
type: 'POST',
url: "webservices/view_patient_medical_history.php",
async: false,
//data: {'log_id': data},
success: function(response) {
dataSet = JSON.parse(response);
}
});
// var dataSet_arr = jQuery.makeArray(dataSet['responseText']);
$('#patient_medical_history').DataTable({
data: dataSet,
columns: [{
title: "Patient ID",
class: "center"
}, {
title: "Current Medications",
class: "center"
}, {
title: "Allergies",
class: "center"
}, {
title: "Diabetes",
class: "center"
}, {
title: "Asthma",
class: "center"
}, {
title: "Arthritis",
class: "center"
}, {
title: "High Blood Pressure",
class: "center"
}, {
title: "Kidney Problem",
class: "center"
}, {
title: "Liver Problem",
class: "center"
}, {
title: "Heart Problem",
class: "center"
}, {
title: "Other Problems",
class: "center"
}, {
title: "Present Problem",
class: "center"
}, {
title: "Last Updated",
class: "center"
}],
"scrollX": true,
//"paging": false,
"info": false,
//"lengthMenu": false,
dom: 'lBfrtip',
buttons: [
'copy', 'pdf', 'print'
]
/*"paging": false,
"info": false,
dom: 'Bfrtip',
buttons: [
'excel', 'pdf', 'print'
]*/
});
$('th').css("white-space", "nowrap");
});
Ответы
Ответ 1
Чтобы активировать клик по ячейке, вы должны использовать делегированный обработчик событий - это будет работать с любой dataTable:
$('.dataTable').on('click', 'tbody td', function() {
//get textContent of the TD
console.log('TD cell textContent : ', this.textContent)
//get the value of the TD using the API
console.log('value by API : ', table.cell({ row: this.parentNode.rowIndex, column : this.cellIndex }).data());
})
Извлечение данных по нажатой строке может быть выполнено с помощью
$('.dataTable').on('click', 'tbody tr', function() {
console.log('API row values : ', table.row(this).data());
})
Если вы хотите отправить содержимое строки через AJAX, вы должны преобразовать массив в объект и затем включить его в качестве data
:
$('.dataTable').on('click', 'tbody tr', function() {
var data = table.row(this).data().map(function(item, index) {
var r = {}; r['col'+index]=item; return r;
})
//now use AJAX with data, which is on the form [ { col1 : value, col2: value ..}]
$.ajax({
data: data,
url: url,
success: function(response) {
...
}
})
Если вам нужна простая ссылка в ячейке с target: _blank
вы можете использовать render
:
columns: [
{ title: "Patient ID", class: "center", render: function(data, type, full, meta) {
return '<a href="showdata/id?'+data+'" target=_blank>Show patient</a>'
}
},
Ответ 2
Сначала убедитесь, что вы изменили код инициализации dataTable, чтобы сохранить в переменной, подобной этой
var oPatientMedicalHistory = $('#patient_medical_history').DataTable({
//your stuff
});
Затем вы можете назначить событие click для всех строк, подобных этому
EDIT: Как указано Gyrocode.com, мы должны использовать делегированный обработчик событий, так как tr создаются динамически по мере того, как мы печатаем страницы. Поэтому код должен выглядеть так.
$('#patient_medical_history tbody').on('dblclick','tr', function() {
var currentRowData = oPatientMedicalHistory.row(this).data();
// alert(currentRowData[0]) // wil give you the value of this clicked row and first index (td)
//your stuff goes here
});
Это должно помочь вам.
Ответ 3
Вам нужно добавить обработчик событий при нажатии на ячейки (td) вашего типа данных, и вам нужно определить действие, которое вы хотите обработать в этом обработчике событий.
DataTables
является отличным источником, чтобы взглянуть и поиграть.
Ответ 4
Мы используем:
rowCallback: function (row: Node /*, data: any[] | Object, index: number */) {
// Intercept clicking of datatable links to avoid a full page refresh
$('a', row).click(function (e) {
e.preventDefault()
// const href = $(this).attr('href')
// parent.router.navigate([href])
})
// Navigate using anchor in cell to make entire cell clickable
$('td', row).click(function (/* e */) {
const anchor = $(this).find('a:first')[0]
if (anchor) {
const href = $(anchor).attr('href')
parent.router.navigate([href])
}
})
return row
}
Не уверен, что это лучший подход, но он выполняет эту работу. Да благословит вас Господь!
Извиняется, что это TypeScript, но его мертвый просто конвертировать в JS.
Ответ 5
со своей стороны, используя row: this.parentNode.rowIndex
не работал. Я использовал this.parentNode
вместо этого и работал как шарм