我有标准的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
事件或以某种方式检测按钮单击?
感谢
答案 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以获取代码和演示。