数据表专注于搜索,但不是 keyup

Posted

技术标签:

【中文标题】数据表专注于搜索,但不是 keyup【英文标题】:Datatables focusout working on search, but not keyup 【发布时间】:2018-01-22 10:17:46 【问题描述】:

我对数据表有一个奇怪的问题,我很困惑。我有一个表格,其中一个单元格包含一个链接。我为搜索字段添加了一个 initComplete 函数,该函数检测是否按下了 enter 键或触发了 focusout 事件。

focusout事件按预期工作,但keyup事件触发后,表格绘制,但链接不起作用。当我第一次单击链接时,它会再次调用我的 ajax 源,此时表格再次绘制,然后链接工作。

focusout 事件触发器完全按预期工作,并且链接在第一次点击时工作,并且没有对 ajax 源的额外调用。

我想知道 keyup 事件处理程序是否干扰了数据表的默认配置,这也是一个 keyup 函数。我正在使用 .unbind() ,我认为它会删除该事件绑定,但我想知道这是否由于某种原因不起作用。

代码如下:

var Patients = function () 

var patient_list = function() 
    var table = $('#patient_list').on('preXhr.dt', function ( e, settings, data ) 
            App.blockUI();
        ).DataTable(
        "language": 
            "aria": 
                "sortAscending": ": activate to sort column ascending",
                "sortDescending": ": activate to sort column descending"
            ,
            "emptyTable": "No data available in table",
            "info": "Showing _START_ to _END_ of _TOTAL_ entries",
            "infoEmpty": "No entries found",
            "infoFiltered": "",
            "lengthMenu": "_MENU_ entries",
            "search": "Search:",
            "zeroRecords": "There are no results..."
        ,
        "fnDrawCallback": function( oSettings ) 
          this.show();
          App.unblockUI();
        ,
        "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) ,
        "fnServerParams": function (aoData) ,
        buttons: [],
        "columns": [
        
            //name
            "type": "html",
            "searchable": true,
            "orderable": true
        ,
        
            //Home Phone
            "type": "html-num",
            "searchable": true,
            "orderable": true
        ,
        
            //Cell Phone
            "type": "html-num",
            "searchable": true,
            "orderable": true
        ,
        
            //Email
            "type": "html",
            "searchable": true,
            "orderable": false
        ,
        
            //DOB
            "type": "date",
            "searchable": false,
            "orderable": false
        ,
        
            //Address
            "type": "html",
            "searchable": true,
            "orderable": false
        ,
        
            //Latest Activity
            "type": "html",
            "searchable": true,
            "orderable": false
        
    ],
        "order": [[0, 'asc']],
        "lengthMenu": [
            [10, 15, 20, 50, -1],
            [10, 15, 20, 50, "All"] // change per page values here
        ],
        // set the initial value
        "pageLength": 50,
        "bJQueryUI": true,
        "bServerSide": true,
        "bProcessing": false,
        "searching": true,
        "sAjaxSource": base_url + 'Patients/load_patient_list',
        "sServerMethod": "POST",
        "bStateSave": false,
        "initComplete": function() 
          var $searchInput = $('#patient_list_filter input');
          $searchInput.unbind();
          $searchInput.on('keyup focusout', function(e) 
            if(e.type == 'keyup' && e.keyCode == 13) 
              table.search(this.value).draw();
              return;
             else if(e.type == 'focusout')
              table.search(this.value).draw();
              return;
             else 
              return;
            
          );
        
    );

【问题讨论】:

我刚发现在搜索栏按回车后,第一次点击排序功能也不起作用,只有第二次点击才会排序。 【参考方案1】:

尝试使用This method,on 接受包含多个事件和处理程序的对象。

$searchInput.on(
   keyup : function(e) 
        if(e.keyCode == 13) 
          table.search(this.value).draw();
          return;
        
   ,
   focusout : function(e) 
         table.search(this.value).draw();
         return;
    
);

【讨论】:

我试过这个,它的工作方式相同。它仍然会再次进行 ajax 调用,而 focusout 不会进行额外的调用并按预期工作。

以上是关于数据表专注于搜索,但不是 keyup的主要内容,如果未能解决你的问题,请参考以下文章

为啥搜索过滤器的工作级别太高?

如何在ajax成功中调用('keyup')

年龄不是Kaggle的上限!我只是按照自己的兴趣专注于机器学习

使用 `keyup` 从我的 `.json' 文件中过滤/搜索已经显示在我的 html 上

使用 keyup vuejs 和 laravel 进行即时搜索

iPad - 在专注于输入字段时放大方向变化