我在使用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>
我在document.ready上调用$('#myTable').dataTable({...});
,并希望在单击按钮时获取已检查输入的所有行(即使它们不在表的当前页面上)。
要获取所有行(包括未选中的行),我使用$('#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:我创建了simple fiddle here
答案 0 :(得分:3)
如果我们检查DOM,我们可以看到只有当前页面元素是DOM的一部分,因此其他元素只是因为它们不在DOM中而只存在于内存中而被隐藏。
然而,对于这个异常问题,它似乎只发生在1.8.x之前的jQuery版本中,因此它可能是修复后的库中的一个错误。
显示has
方法的Here's a test case不适用于1.8.x以下版本的内存中元素:
console.log($('<div><span></span></div>').has('span').length); //0
修改: 这是一个错误,我找到了票证:http://bugs.jquery.com/ticket/11543