我试图让jQuery dataTable的行为方式让用户可以选择一行,然后点击一个按钮(位于页面的其他位置,但不表格或其中)并弹出一个JS警告。
这是我的dataTable:
$("#my-datatable").dataTable( {
"bProcessing" : true,
// Commenting out next line
//"sDom" : 't',
"sAjaxSource" : "some/url/on/my/server",
"sAjaxDataProp" : "",
"bDestroy" : true,
"fnServerData" : function(sSource, aoData, fnCallback) {
aoData.push({
"name" : "asking",
"value" : "yes"
});
request = $.ajax({
"dataType" : "json",
"type" : "GET",
"url" : sSource,
"data" : aoData,
"success" : fnCallback
});
},
"aoColumns" : [
{
"mDataProp" : "name"
},
{
"mDataProp" : "expr"
},
{
"mDataProp" : "seq"
}
]
});
这是我的按钮:
<div id="bam-btn-div">
<input type="button" id="bam-btn" value="BAM!" onclick="bam();"/>
</div>
当用户在dataTable中选择一行,然后单击该按钮时,我想要以下函数调用:
function bam() {
alert("Deleting the selected row");
// Delete the selected row in the dataTable
}
最后,jQuery dataTable尝试填充的HTML表:
<div id="datatable-div">
<table id="optconfig-datatable">
<thead>
<tr>
<th>Name</th>
<th>Expression</th>
<th>Sequence</th>
</tr>
</thead>
<tbody></tbody>
</table>
</div>
我尝试按照示例here但无法获得任何效果。任何人都可以找到我需要添加的配置(到dataTable和/或其他)?提前谢谢!
答案 0 :(得分:3)
您正在使用jQuery,您也可以保持正常运行。
$('#bam-btn').on('click', function(){
alert("BAM!");
});
另一方面,ID必须是唯一的,但我相信你知道,所以请确保你不要一遍又一遍地重复使用相同的ID。
此外,如果在.ready()
执行后将此元素添加到DOM中,则需要将事件处理程序附加到静态父元素,以便它可以正确委派click事件。
$(document).on('click', '#bam-btn', function(){
alert("BAM");
});
我将保留以上内容,我不想删除我的答案的所有部分,因为你永远不知道谁将来会发现它有用
首先,我们需要创建一个可用于所有函数范围的变量。这样,我们可以引用变量来获取我们想要删除的元素。
我们应该将此变量置于文档就绪函数之外
var theRow = '';
$(document).ready(function(){
//existing code here
});
现在我们已经准备好了“全局范围”变量,我们可以随时对其进行修改和访问。
var theRow = '';
$(document).ready(function(){
$('tr').click(function(){
//we need to store a unique piece of information about this row.
//Without much to go on, I'm going to rely on the index.
theRow = $(this).index();
});
$('#bam-btn').click(function(){
$('tr').eq(theRow).remove();
});
});
And here is your decent working jsFiddle as an example
对于未来的用户以及可能会发现此功能的其他任何人
jQuery 提供的:eq()
选择器无法利用.querySelectorAll()
来获得相当大的性能提升。因此,就目前而言,您应始终使用.eq()
而不是:eq()
。
答案 1 :(得分:2)
请检查您的:
function bam() {
alert("BAM!");
}
不在此声明中:
$(document).ready(function() {
// STATEMENT
});
如果您的功能位于$(document).ready()
,则表示该功能仅适用于该范围内的function()
。
将代码移到$(document).ready()
语句的上方或下方,按钮中的onclick
事件处理程序将能够找到并调用。
要从数据表中删除特定元素,请尝试使用此JavaScript:
$(document).ready(function() {
var oTable = $("#my-datatable").dataTable( {
"bProcessing" : true,
// Commenting out next line
//"sDom" : 't',
"sAjaxSource" : "some/url/on/my/server",
"sAjaxDataProp" : "",
"bDestroy" : true,
"fnServerData" : function(sSource, aoData, fnCallback) {
aoData.push({
"name" : "asking",
"value" : "yes"
});
request = $.ajax({
"dataType" : "json",
"type" : "GET",
"url" : sSource,
"data" : aoData,
"success" : fnCallback
});
},
"aoColumns" : [
{
"mDataProp" : "name"
},
{
"mDataProp" : "expr"
},
{
"mDataProp" : "seq"
}
]
});$("#my-datatable").dataTable( {
"bProcessing" : true,
// Commenting out next line
//"sDom" : 't',
"sAjaxSource" : "some/url/on/my/server",
"sAjaxDataProp" : "",
"bDestroy" : true,
"fnServerData" : function(sSource, aoData, fnCallback) {
aoData.push({
"name" : "asking",
"value" : "yes"
});
request = $.ajax({
"dataType" : "json",
"type" : "GET",
"url" : sSource,
"data" : aoData,
"success" : fnCallback
});
},
"aoColumns" : [
{
"mDataProp" : "name"
},
{
"mDataProp" : "expr"
},
{
"mDataProp" : "seq"
}
]
});
$('button#bam-btn').on('click', function() {
var anSelected = fnGetSelected( oTable );
oTable.fnDeleteRow( anSelected[0] );
} );
});
答案 2 :(得分:0)
我的动态数据加载表遇到了类似的问题。每次我添加内容时,旧节点都会消失,丢失链接的事件。 我解决了数据加载后调用函数的问题:
function insertevents(table_id){
var oTable = jQuery('#'+tableid).dataTable( {"bRetrieve": true });
oTable.$('tr').click(function(){
jQuery(this).toggleClass('row_selected');
} );
// Extra code here
}
添加“bRetrieve”参数非常重要,因为该表先前已初始化。
此外,我已经改进了控制键盘事件的功能以实现可访问性:
oTable.$('tr').keyup( function(event) {
if (event.which == 13 || event.which == 32) {
event.preventDefault();
jQuery(this).toggleClass('row_selected');
}
} );
oTable.$('tr').keydown( function(event) {
if (event.which == 13 || event.which == 32) {
event.preventDefault(); // Desactivamos este efecto
}
});
这一行应该替换第一个例子的注释行。现在可以从键盘使用该表,使用intro或空格键进行选择。请记住向表格中插入的元素添加tabindex = 0,以便我们可以使用Tab键进行导航。
答案 3 :(得分:0)