如何检测DataTable子行中的按钮单击事件?

时间:2016-02-13 11:30:57

标签: javascript jquery datatables

我有标准的DataTable代码,用于填充数据表并在行单击时显示子行。 在子行内(使用格式化功能)我添加了一个按钮,我想在点击它时做一些事情,但每次我点击按钮(数据表包含一个新的tr-> td内的子行)用于打开/关闭子行的td click事件被触发,我在格式函数中得到"Uncaught TypeError: Cannot read property '0' of undefined"数组的d[]

这是子行打开/关闭的代码:

$('tbody').on('click', 'td', function() {
    var tr = $(this).closest('tr');
    id = $(this).closest('table').attr('id');
    table = $('#' + id).DataTable();
    var row = table.row(tr);
    if (row.child.isShown()) {
        // This row is already open - close it
        row.child.hide();
        tr.removeClass('shown');
    } else {
        // Open this row
        row.child(format(row.data(), id)).show();
        tr.addClass('shown');
    }
});

function format(d, id) {
// `d` is the original data object for the row
if(sessionStorage['name']!=undefined)
    return '<img src="images/photo.jpg" id="photo" />' + '<p>Session created by:' + d[0] + '</p>' + '<p>Start Date:' + d.start_date + '</p>' + '<p>Extra info:' + d[3] + '</p>' + "<button class='btn btn-default' id='joinbutton' role='button'>Join Session</button>";
else
return '<div>' + '<img src="images/photo.jpg" id="photo" />' + '<p>Session created by:' + d[0] + '</p>' + '<p>Start Date:' + d.start_date + '</p>' + '<p>Extra info:' + d[3] + '</p>' + '</div>';

}

有没有办法防止为子行触发td click事件或以某种方式检测按钮单击? 感谢

3 个答案:

答案 0 :(得分:5)

我提出了我的评论后的片段(请参阅评论,而不是格式化函数中的那些,我需要它们才能使代码段运行):

4
function format(d, id) {
  // `d` is the original data object for the row
  //if(sessionStorage['name']!=undefined)
    return '<img src="http://icons.iconarchive.com/icons/treetog/junior/256/image-format-jpg-icon.png" id="photo" />' + '<p>Session created by:' + d[0] + '</p>' + '<p>Start Date:' + d.start_date + '</p>' + '<p>Extra info:' + d[3] + '</p>' + "<button class='btn btn-default' id='joinbutton' role='button'>Join Session</button>";
  //else
    //return '<div>' + '<img src="images/photo.jpg" id="photo" />' + '<p>Session created by:' + d[0] + '</p>' + '<p>Start Date:' + d.start_date + '</p>' + '<p>Extra info:' + d[3] + '</p>' + '</div>';

}

// to handle the joinbutton created dynamically you need:
// avoid to use the same ID for more than one element
$(document).on('click', 'button[role="button"]', function(e) {
  alert('This is the button');
});

$(function () {
  $('tbody').on('click', 'td', function(e) {
    // to avoid to receive the button click inside the td you need:
    if ($(e.target).is(':not(td)')) {
      alert('This is inside td');
      return;
    }
    var tr = $(this).closest('tr');
    id = $(this).closest('table').attr('id');
    table = $('#' + id).DataTable();
    var row = table.row(tr);
    if (row.child.isShown()) {
      // This row is already open - close it
      row.child.hide();
      tr.removeClass('shown');
    } else {
      // Open this row
      row.child(format(row.data(), id)).show();
      tr.addClass('shown');
    }
  });
});
table, th, td {
  border: 1px solid black;
  border-collapse: collapse;
}
th, td {
  padding: 10px;
}

答案 1 :(得分:2)

我用@gaemaf解决方案解决了我的问题:

// Handle click on checkbox
$("#example tbody").on("click", 'input[type="checkbox"]', function(e){
    var $row = $(this).closest("tr");

    if(this.checked){
        $row.addClass("active");
    } else {
        $row.removeClass("active");
    }

    // Prevent click event from propagating to parent
    e.stopPropagation();
});

// Handle click on table cells
$("#example tbody").on("click", "td", function(e){
    // Begin Solution
    if ($(e.target).is(':not(td)')) {
        return;
    }
    // End solution
    $(this).parent().find('input[type="checkbox"]').trigger("click");
});

答案 2 :(得分:0)

  

<强>解

向按钮添加单击处理程序并从处理程序返回false以防止默认操作并阻止事件传播到父元素。或者,您也可以致电stopPropagation()preventDefault()

$('#example tbody').on('click', 'button', function (e) {

   // ... skipped ...

   return false;
});

最好删除id='joinbutton'并改用类名,例如btn-join。然后,您可以使用以下代码定位特定按钮。

$('#example tbody').on('click', '.btn-join', function (e) {

   // ... skipped ...

   return false;
});
  

<强>样本

请参阅this jsFiddle以获取代码和演示。