如何使数据表行或单元格可点击?

Posted

技术标签:

【中文标题】如何使数据表行或单元格可点击?【英文标题】:How to make datatable row or cell clickable? 【发布时间】:2016-06-03 12:36:48 【问题描述】:

我正在处理特定用户的历史开发,我希望它使用 dataTables 来完成。但是,我找不到使我的行或特定单元格可点击的方法。我需要使用特定行的单独点击打开单独的链接。任何帮助,将不胜感激。提前谢谢!!!

Edited:: 如果我点击一行,我需要该行的所有数据,这不是问题。我能做到。我需要知道的是使用该特定行数据发出 $.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");
);

【问题讨论】:

`我需要为特定行打开单独的链接和单独的点击。`那么你使用什么值来打开不同的链接?你是从 thw 行本身获取的吗? 对不起,伙计。不必费心添加不必要的代码,因为几乎每个人都习惯了数据表的常见实现。对于这些基本功能,我想要的只是使行可点击。无论如何...这是我的演示 tanle 的代码。我想点击行。 我已经用表格基本结构的代码编辑了我的问题。现在,我需要那些可点击的行。 实际上...如果我可以使用特定的行或单元格数据向 php 发送 $_GET 或 $_POST 请求,那就足够了... Reddy 如果我想让特定列的每个单元格都可以点击怎么办?单击该单元格时,我想进行 ajax 调用。请提出一些让它工作的方法 【参考方案1】:

要激活单击单元格,您必须使用委托事件处理程序 - 这将适用于任何数据表:

$('.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>'
  
,

【讨论】:

我想你忘了提到如何设置变量table 您可以将其用于变量tablevar table = $('.dataTable').DataTable(); 这似乎对我不起作用。 “table.row ...”总是返回未定义。该表被识别,行也是如此(例如 table[0].rows) 一点额外的:对于单元格点击处理程序,this._DT_CellIndex 是一个具有行 ID 和列索引的对象。 单元格中的纯链接示例对我有用。谢谢。【参考方案2】:

首先确保更改数据表初始化的代码以保存到这样的变量中

var oPatientMedicalHistory = $('#patient_medical_history').DataTable(
   //your stuff
);

然后你可以像这样为所有行分配一个点击事件

编辑: 正如 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
);

这一定能帮到你。

【讨论】:

非常感谢,伙计。这肯定会帮助我继续进行下去。但是,我对数据表很陌生。你能告诉我 currentRowData[0] 是否给了我点击的行,那么 currentRowData[1] 会返回什么?如果我希望获取该行的特定单元格的值,该过程可能是什么? currentRowData = 当前行的值数组 currentRowData[0] = 数组的第一个索引,这意味着该行的第一个 td 值,同样currentRowData[1] 会给你第二个 td 值 这仅适用于第一页上的行,因为 DataTables 会动态创建 tr 节点。您需要使用委托事件处理程序,例如$('#patient_medical_history tbody').on('dblclick', 'tr', function() @Gyrocode.com 谢谢你提醒我这件事。我会更新我的答案。【参考方案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 并且工作得像个魅力

【讨论】:

以上是关于如何使数据表行或单元格可点击?的主要内容,如果未能解决你的问题,请参考以下文章

在 UIViewController 中使单元格可点击

C# WPF 工具包:如何​​使数据网格中的单元格可编辑?

如何使 UICollectionView 单元格可移动?

如何在datagrid中使一行的单元格不可点击

在 Swift 中,如何使动态 tableView 单元格可选,以便在按下它时转移到不同的 tableViewController?

仅在选择时设置Jtable单元格可编辑