4

我在使用 jQuery + dataTables 插件时偶然发现了一个奇怪的行为。

假设我有下表:

<table id="myTable">
    <thead>
        <th>col 0</th>
        <th>col 1</th>
    </thead>
    <tbody>
        <tr>
            <td><input type="checkbox" /></td>
            ...
        </tr>
        ...
    </tbody>
</table>

我调用$('#myTable').dataTable({...});document.ready 并希望在单击按钮时获取所有已检查输入的行(即使它们不在表格的当前页面上)。

为了获取所有行(包括未选中的),我使用$('#myTable').dataTable().fnGetNodes()API-Link)返回一个包含所有这些 tr 节点的数组。之后我使用这个数组来构造一个 jQuery 对象:

var nodearray = $('#myTable').dataTable().fnGetNodes();
var trs = $(nodearray);

我不明白的部分来了。我尝试了两种方法来获取所有检查的节点,但结果不同:

// returns all rows correctly (including invisible rows from other pages)
trs.find('td input:checked').closest('tr'); 

// return only rows from the current page
trs.has('td input:checked');

DataTables-plugin 做了什么来隐藏行以便 jQuery.has() 找不到它们,为什么 jQuery.find() 仍然有效?

PS:我在这里创建了一个简单的小提琴

4

1 回答 1

3

如果我们检查 DOM,我们可以看到只有当前页面元素是 DOM 的一部分,所以其他的只是因为它们不在 DOM 中而仅驻留在内存中而被隐藏。

然而,对于差异问题,它似乎只发生在 1.8.x 之前的 jQuery 版本中,因此它可能是已修复的库中的错误。

这是一个测试用例,显示该has方法不适用于 1.8.x 以下版本中的内存元素:

console.log($('<div><span></span></div>').has('span').length); //0

编辑:这是一个错误,我找到了票:http ://bugs.jquery.com/ticket/11543

于 2013-09-20T13:09:34.090 回答