【问题标题】:jQuery Datatable doesn't update search after change text of TD更改 TD 文本后,jQuery Datatable 不更新搜索
【发布时间】:2013-03-04 08:50:08
【问题描述】:

在我的数据表中,我有一个隐藏列包含最近行中数据的当前状态的名称,但是当按下输入复选框时,通过这种方式更改该隐藏列的文本:

$("#rBuscarPerfil").on('click','input[type="checkbox"]',function() {
    if($(this).is(':checked')) {
        $(this).closest('tr').find('td:last').html("Activo");
    } else {
        $(this).closest('tr').find('td:last').html("Desactivado");
    }
........
}

当按下顶部的按钮时,例如:

Active,在dataTable的输入搜索中放置了文本“Activo”和table show only results在每行的最后一个td中包含“Activo”这个词。

Inactivo,在 dataTable 的输入搜索中放置文本并仅显示结果,每行的最后一个 td 中包含“Desactivado”字。

问题是这样的:搜索仅在打开页面或刷新浏览器时有效,但如果我选中或取消选中每一行中的任何复选框,则最后一行中的文本最后一行中的文本会正确更改。但似乎该表处于当前状态并且不会更新其属性,并且搜索不会显示这些更改的结果。

HTML代码表

<table cellspacing="1" id="rBuscarPerfil" class="tableResultsSearch" name="rBuscarPerfil">
<thead>
    <tr>
        <th>NOMBRE</th>
        <th>DESCRIPCIÓN</th>
        <th>ACCIÓN</th>
        <th>STATUS</th>
        <th style="display:none;">STATUS2</th>
    </tr>
</thead>
<tbody>
</tbody>
</table>

Js 加载表格内容

if(response.success == "success") {
if(area == "perfil") {
    $('#rBuscarPerfil tbody tr').remove();
    $.each(response, function (index,record){
        if(valNumber(index)) {
            var row = $("<tr class='"+record.IdPerfil+"'/>");
            $("<td nombre='"+record.NomPerfil+"'/>").text(record.NomPerfil).appendTo(row);
            $("<td />").text(record.DesPerfil).appendTo(row);
            $("<td />").html("<img src='media/icons/edit_item.png' class='bModifyProfile' cve='"+record.DesPerfil+"' alt='Editar' title='Editar'></img><img src='media/icons/delete_item.png' class='bDeleteProfile' cve='"+record.IdPerfil+"' alt='Eliminar' title='Eliminar'></img>").appendTo(row);

           if (record.EdoPerfil == 1) {
                $("<td />").html("<input type='checkbox' checked/>").appendTo(row);
                row.css("backgroundColor","#b0f2b1");
            } else {
                $("<td />").html("<input type='checkbox' />").appendTo(row);
                row.css("backgroundColor","#ffddec");
            }

            $("<td style='display:none;' />").text(record.nomStatus).appendTo(row);
            row.appendTo("#rBuscarPerfil tbody");
        }
    });
}
}

var oTable = $('#rBuscarPerfil').dataTable({
    "bJQueryUI": true,
    "bRetrieve" : true,
    "bDestroy" : true,
    "aaSorting": [[ 0, "desc" ]],
    "sPaginationType" : "full_numbers"
});

oTable.fnDraw();

希望我已经解释过了。

【问题讨论】:

  • 能提供jsfiddle吗?
  • 代码太多了,也许我会把最重要的部分放在帖子里,或者等一下,我会尝试创建一个jsfiddle
  • 添加你绑定逻辑的事件监听代码
  • 请查看编辑后的帖子!

标签: jquery search datatables jquery-datatables


【解决方案1】:

嗯,我遇到了和你一样的问题,我通过使用“cell”API 对象解决了这个问题。基本上您必须使用 API 进行更改。

如果你使用“oldschool”DataTable 构造函数,你必须使用dataTable().api() ,但如果您使用的是新的构造函数,它会隐式变为 DataTable() 与所有 API

// 1. Get the referenced table with its API 
   var tableAPI = $("#rBuscarPerfil").dataTable().api();

// 2. Get the row nodes, because you have to apply the changes to the plugin data
   var nodes    = tableAPI.rows().nodes();

// 3. Let's do the magic!
   $('input[type="checkbox"]', nodes).on('click','input[type="checkbox"]', function () 
   {
     // Let's Store the reference
        var checkBox = this;

     // Could you convert it to a valid DataTable cell, please?
        var cell     = tableAPI.cell( $(checkBox, nodes).closest("tr").find("td:last") );
     // Thanks!

     // Finally change the sweet and tasty data
        cell.data( 
             $(checkBox).is(":checked") ? "Activo" : "Desactivado" 
        ).draw(); // Don't forget to call this beauty
    });

PS。这是我的第一个答案,所以我希望它对你有所帮助。

更新 好吧,我意识到最后调用了draw() -- 它刷新了数据 --,但也从一开始就绘制了数据;因此,如果您在其他页面中,则在使用复选框进行更改后,它会将您返回到 DataTable 中的第一页。

【讨论】:

    【解决方案2】:

    我的例子:

    <td id="H105" class="locker-bg-selected-td spacer" title="118242"><a class="lnkLocker locker-bg-selected-a cls0" href="javascript:$(`#modalLockStudent`).modal(`show`);$(`#`+$(`#H105`).find(`.span-coverScreen`).text()).fadeOut(5000);void(0);">H105</a><span class="span-student-name" style="display:none">My student 1/span><span id="spanH105" class="span-student-id" style="display:none">0101010</span><span class="span-ada" style="display:none"></span><span class="span-broken" style="display:none"></span><span class="span-reserved" style="display:none"></span><span class="span-serial" style="display:none">A1A1A1</span><span class="span-combo" style="display:none">18-02-32</span><span class="span-coverScreen" style="display:none">coverScreen</span></td>
    
    <script>
            function updateDataTablesSearch(locker, studentId, studentName, coverScreen) {
                if (locker != null && locker != '') {                
                    var tableAPI = $("#tbAD1").dataTable().api();
                    var cell = tableAPI.cell('#' + locker);
    
                    $(cell.node()).attr('title', studentId);
                    $(cell.node()).find('.span-student-id').text(studentId);
                    $(cell.node()).find('.span-student-name').text(studentName);
                    $(cell.node()).find('.span-coverScreen').text(coverScreen);
    
                    cell.data( 
                        cell.node().innerHTML
                    );
                    cell.draw();            
                }
            }
    </script>
    

    【讨论】:

      猜你喜欢
      • 2019-09-13
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 2012-07-26
      • 2017-03-18
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      相关资源
      最近更新 更多