Javascript Jquery数据表捕获搜索事件,但不捕获来自排序的事件

Javascript Jquery数据表捕获搜索事件,但不捕获来自排序的事件,javascript,jquery,datatables,Javascript,Jquery,Datatables,我正在呈现Jquery DataTables表中的数据图,并希望触发一个函数,在UI搜索或调用如下搜索的表内容发生更改时重新绘制该图 $('#mytable').DataTable().column(0).search('my value').draw() 在我的桌子上,我有以下代码 var table = $('#mytable').DataTable({ //my settings here }).on( 'search.dt', function () { updateGra

我正在呈现Jquery DataTables表中的数据图,并希望触发一个函数,在UI搜索或调用如下搜索的表内容发生更改时重新绘制该图

$('#mytable').DataTable().column(0).search('my value').draw()
在我的桌子上,我有以下代码

var table = $('#mytable').DataTable({
    //my settings here
}).on( 'search.dt',   function () { updateGraph( GraphData ) ; } );
该代码正在工作,但在排序事件(如对列排序)上会触发搜索,然后触发排序事件。是否有一种方法仅在表内容更改时触发更改

有关更多信息,请参见此示例。

这是一个很好的机会!从未意识到即使在简单的排序中也会触发
search.dt
事件。事实上,这是一个奇怪的问题。也许其他人会想出一个更好的主意,但我认为保留当前行的“快照”,并在触发
search.dt
时将它们与行进行比较,可以解决问题。如果
快照
基于表行的默认顺序,或者
索引
,而不是应用的顺序,那么我们可以触发
datachange.dt
事件,如果且仅当数据表中的数据实际发生了更改:

var table = $('#example').DataTable({
   snapshot: null
})
.on('search.dt', function() {
  var snapshot = table
     .rows({ search: 'applied', order: 'index'})
     .data()
     .toArray()
     .toString();

  var currentSnapshot = table.settings().init().snapshot;

  if (currentSnapshot != snapshot) {
   table.settings().init().snapshot = snapshot;
   if (currentSnapshot != null) $('#example').trigger('datachange.dt')
  }
})
.on('datachange.dt', function() {
  alert('data has changed')
  //updateGraph( GraphData )
})

演示->

谢谢,这看起来正好解决了我的问题。我假设处理开销很低,或者至少低于调用updateGraph函数来更新图形的开销。这就是区分订单和“搜索”事件的初衷,以限制调用函数update而不改变实际数据的需要,而不考虑订单。@David,感谢您接受。我理解这种担忧,也在考虑这一点。但是想想看,如果您有一个分页的表,其中可能有20列、500行和平均每列20个字符的内容,那么它将是195kb的动态数据,这在合理的范围内。它不会减慢页面的呈现速度,“最好”是在触发datachange事件之前延迟1-2毫秒,所以我认为这是可以的。。但和其他一切一样,只有真实的现场场景才能成为评判的标准……感谢您提供的最新估计。对于我的应用程序,更新延迟图似乎比只输入触发搜索的订单事件慢得多。解决方案是开箱即用的,只需要将“#示例”编辑到我的页面的“#mytable”。@David将其作为一个问题提出->在我看来,你发现的行为是一个“错误”,不符合逻辑。事件和触发事件的操作之间应该有区别。复制主开发人员的回复,“实际上,这在技术上是正确的,因为当对表应用排序时,DataTables会进行筛选。这是触发它的代码行。_fnReDraw函数将触发订单和搜索。这样做的原因是,顺序将应用于整个数据集,然后它将再次应用过滤器,而不是将排序应用于过滤后的数据集。它必须是一个或另一个——也许不是最优的,但这是我选择的实现它的方式。”