数据表激活单个单元格编辑onclick
Datatable activate single cell editing onclick
我无法在此处使用 jQuery 数据表插件:
https://editor.datatables.net/examples/inline-editing/simple
我一直出错,所以我放弃了它并决定自己做。
从数据表开始:
$.ajax({
url: 'api/searchVoyageInfo.php',
type: 'POST',
data: '',
dataType: 'html',
success: function(data, textStatus, jqXHR){
var jsonObject = JSON.parse(data);
var table = $('#example1').DataTable({
"data": jsonObject,
"columns": [{
{ "data": "COLUMN1" },
{
"data": "COLUMN2",
"fnCreatedCell": function (nTd, sData, oData, iRow, iCol)
{
$(nTd).html("<a href='#' class='checkBound'>"+oData.COLUMN2+"</a>
<input type='text' class='editbound'
id='editbound' data-uid='"+oData.VOYID+"'
data-editbound='"+oData.COLUMN2+"' value='"+oData.BOUND+"
display: none;' />");
}
},
{ "data": "COLUMN3" },
// few more columns
}],
"iDisplayLength": 50,
"paging": true,
"bDestroy": true,
"autoWidth": true,
"dom": 'Bfrtip',
"buttons": [
// some extend buttons
]
});
},
error: function(// some stuff){
// do some other stuff
// this part is not important
}
});
在 COLUMN2 中,您应该会看到一个 class 'checkBound',它在页面加载时可见。还有一个输入 class 'editbound' 是不可见的。
这里是应该隐藏class'checkBound'然后显示class的函数'editbound':
$('#example1').on('click', 'tr > td > a.checkBound', function(e)
{
e.preventDefault();
var $dataTable = $('#example1').DataTable();
var tr = $(this).closest('tr');
var data = $dataTable.rows().data();
var rowData = data[tr.index()];
$('.checkBound').hide();
$('.editbound').show();
});
使用上面的方法,当页面加载完成时,数据表显示没有问题。
单击带有 class 'checkBound' 的单元格之一以显示输入 class 'editbound' 时,输入本身会显示,但也会显示其他单元格在专栏中。
点击前:
点击后:
如您所见,BOUND 列中的第一个单元格是被单击的单元格。但是当点击时,其余的单元格被激活。我想防止这种情况发生。
我怎样才能完成这项工作?
这就是我创建带有按钮的列的方式。你应该可以做类似的事情而不是按钮!
fields: [
{ name: "column_id", title:"View" ,itemTemplate: function(value) {
return $("<button>").text("buttontitle")
.on("click", function() {
//do something
return false;
});
}]
这就是我(在某种程度上)解决我的问题的方法。在数据表部分,我添加了一个名为 VOYID 的 ID 字段,并将该 ID 与 class 一起包含在 href 和输入中:
"data": "COLUMN2",
"fnCreatedCell": function (nTd, sData, oData, iRow, iCol)
{
$(nTd).html("<a href='#' class='checkBound"+oData.VOYID+"' id='checkBound'>"+oData.COLUMN2+"</a>
<input type='text' class='editbound"+oData.VOYID+"'
id='editbound' data-uid='"+oData.VOYID+"'
data-editbound='"+oData.COLUMN2+"' value='"+oData.BOUND+"
display: none;' />");
}
然后在按钮点击部分,我使用 rowData 检查确切的 class。这样,当您单击 link 时,只会打开唯一的 class 而不是列中的所有单元格:
$('#example1').on('click', 'tr > td > a.checkBound', function(e)
{
e.preventDefault();
var $dataTable = $('#example1').DataTable();
var tr = $(this).closest('tr');
var data = $dataTable.rows().data();
var rowData = data[tr.index()];
var voyid = rowData.VOYID;
$('.checkBound'+voyid).hide();
$('.editbound'+voyid).show();
});
现在,当我单击 link 时,只有那个单元格激活了输入:
我无法在此处使用 jQuery 数据表插件:
https://editor.datatables.net/examples/inline-editing/simple
我一直出错,所以我放弃了它并决定自己做。
从数据表开始:
$.ajax({
url: 'api/searchVoyageInfo.php',
type: 'POST',
data: '',
dataType: 'html',
success: function(data, textStatus, jqXHR){
var jsonObject = JSON.parse(data);
var table = $('#example1').DataTable({
"data": jsonObject,
"columns": [{
{ "data": "COLUMN1" },
{
"data": "COLUMN2",
"fnCreatedCell": function (nTd, sData, oData, iRow, iCol)
{
$(nTd).html("<a href='#' class='checkBound'>"+oData.COLUMN2+"</a>
<input type='text' class='editbound'
id='editbound' data-uid='"+oData.VOYID+"'
data-editbound='"+oData.COLUMN2+"' value='"+oData.BOUND+"
display: none;' />");
}
},
{ "data": "COLUMN3" },
// few more columns
}],
"iDisplayLength": 50,
"paging": true,
"bDestroy": true,
"autoWidth": true,
"dom": 'Bfrtip',
"buttons": [
// some extend buttons
]
});
},
error: function(// some stuff){
// do some other stuff
// this part is not important
}
});
在 COLUMN2 中,您应该会看到一个 class 'checkBound',它在页面加载时可见。还有一个输入 class 'editbound' 是不可见的。
这里是应该隐藏class'checkBound'然后显示class的函数'editbound':
$('#example1').on('click', 'tr > td > a.checkBound', function(e)
{
e.preventDefault();
var $dataTable = $('#example1').DataTable();
var tr = $(this).closest('tr');
var data = $dataTable.rows().data();
var rowData = data[tr.index()];
$('.checkBound').hide();
$('.editbound').show();
});
使用上面的方法,当页面加载完成时,数据表显示没有问题。
单击带有 class 'checkBound' 的单元格之一以显示输入 class 'editbound' 时,输入本身会显示,但也会显示其他单元格在专栏中。
点击前:
点击后:
如您所见,BOUND 列中的第一个单元格是被单击的单元格。但是当点击时,其余的单元格被激活。我想防止这种情况发生。
我怎样才能完成这项工作?
这就是我创建带有按钮的列的方式。你应该可以做类似的事情而不是按钮!
fields: [
{ name: "column_id", title:"View" ,itemTemplate: function(value) {
return $("<button>").text("buttontitle")
.on("click", function() {
//do something
return false;
});
}]
这就是我(在某种程度上)解决我的问题的方法。在数据表部分,我添加了一个名为 VOYID 的 ID 字段,并将该 ID 与 class 一起包含在 href 和输入中:
"data": "COLUMN2",
"fnCreatedCell": function (nTd, sData, oData, iRow, iCol)
{
$(nTd).html("<a href='#' class='checkBound"+oData.VOYID+"' id='checkBound'>"+oData.COLUMN2+"</a>
<input type='text' class='editbound"+oData.VOYID+"'
id='editbound' data-uid='"+oData.VOYID+"'
data-editbound='"+oData.COLUMN2+"' value='"+oData.BOUND+"
display: none;' />");
}
然后在按钮点击部分,我使用 rowData 检查确切的 class。这样,当您单击 link 时,只会打开唯一的 class 而不是列中的所有单元格:
$('#example1').on('click', 'tr > td > a.checkBound', function(e)
{
e.preventDefault();
var $dataTable = $('#example1').DataTable();
var tr = $(this).closest('tr');
var data = $dataTable.rows().data();
var rowData = data[tr.index()];
var voyid = rowData.VOYID;
$('.checkBound'+voyid).hide();
$('.editbound'+voyid).show();
});
现在,当我单击 link 时,只有那个单元格激活了输入: