【问题标题】:Jquery-DataTables catch search event but not those from orderingJquery-DataTables 捕获搜索事件,但不捕获来自排序的事件
【发布时间】:2017-07-11 14:30:12
【问题描述】:

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

$('#mytable').DataTable().column(0).search('my value').draw()

在我的桌子上我有以下代码

var table = $('#mytable').DataTable({
    //my settings here
}).on( 'search.dt',   function () { updateGraph( GraphData ) ; } );

代码正在运行,但在排序事件上,例如对列排序,触发搜索后跟排序事件。有没有办法只在表格内容发生变化时才触发变化?

请参阅此示例以获取更多信息。 https://datatables.net/examples/advanced_init/dt_events.html

【问题讨论】:

    标签: javascript jquery datatables


    【解决方案1】:

    这是一个很好的收获!从未意识到即使在简单订购时也会触发search.dt 事件。其实是个奇葩问题。也许其他人会想出一个更好的主意,但我认为保留当前行的“快照”并将它们与触发search.dt 时的行进行比较可以解决问题。如果snapshot 是基于表行的默认顺序,或者index,而不是应用的顺序,那么当且仅当dataTable 中的数据实际发生变化时,我们才能触发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 )
    })
    

    演示 -> http://jsfiddle.net/hftuew5u/

    【讨论】:

    • 谢谢,这看起来正好解决了我的问题。我假设处理开销很低或至少低于我调用 updateGraph 函数来更新我的图表。这就是区分订单和“搜索”事件的初衷,以限制在不改变实际数据的情况下调用函数更新的需要,而与订单无关。
    • @David,感谢您的接受。我理解这种担心,也在考虑这个问题。但是想想看,如果你有一个分页表,它可能有 20 列、500 行并且每列平均内容为 20 个字符,那么它将是 195kb 的动态数据,这是合理的。它不会减慢页面的渲染速度,在触发 datachange 事件之前“最好”延迟 1-2 毫秒,所以我认为没关系。 ..但与其他一切一样,只有真实的现场场景才能成为评委......
    • 感谢信封背面的估价。对于我的应用程序,更新图的延迟似乎比仅输入触发搜索的订单事件要慢得多。该解决方案开箱即用,只需将“#example”编辑到我的页面的“#mytable”。
    • @David,已将其作为问题提出-> github.com/DataTables/DataTables/issues/953 在我看来,您发现的行为是“错误”,这不合逻辑。事件和触发事件的动作之间应该有区别。
    • 复制主要开发人员的回复,“实际上,这在技术上是正确的,因为 DataTables 在对表应用排序时会进行过滤。这是触发该操作的代码行。_fnReDraw 函数将触发排序和搜索。这样做的原因是排序应用于整个数据集,然后不是也将排序应用于过滤的数据集,而是再次应用过滤器。它需要是一个或者其他——也许都不是最优的,但这是我选择实现它的方式。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2013-11-02
    相关资源
    最近更新 更多