Как сделать доступным числовую строку или ячейку?

Я работаю над развитием истории конкретного пользователя, и я хочу, чтобы это было сделано с помощью 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 вместо этого и работал как шарм