在jQuery中查找第一个可见孩子的索引
我有一个函数可以找到第一个可见孩子的索引。它的工作原理,但我想知道是否有一个更快/更好的方式来做到这一点:在jQuery中查找第一个可见孩子的索引
var TheDiv = $('#' + TheDivID);
var CurrentIndex = 0;
TheDiv.children().each(function() {
if ($(this).is(':visible')) {
CurrentIndex = $(this).index();
break;
}
});
感谢您的建议。
如果TheDiv
确实已经存在,加上在.children()
方法的选择,并使用.index()
来获取元素的索引:
TheDiv.children(':visible').index();
否则,使用:
CurrentIndex = $('#' + TheDivID + ' > :visible').index();
Rob W's answer好,并且可能是编写此代码的最短途径。但是,它不一定是最有效的。
jQuery的自定义选择器是慢。它们不是可以使用querySelectorAll
的本机选择器的补丁。更重要的是,children(':visible')
(或诸如此类)将测试每个元素的可见性,即使这不是您的应用程序所必需的。例如,如果你有300个孩子,第一个是可见的,你不需要测试下一个299,但是这个方法会这样做。
所以实际上你在你的问题中提出的方法可能不会离理想太远。这是行不通的,因为它是(break
不在一个jQuery选择工作)和is
是惊人慢,但我认为它可以清理...
TheDiv.children().each(function (i) {
if (jQuery.expr[':'].visible(this)) {
CurrentIndex = i;
return false;
}
});
这使用return false
打出来的each
循环。它还使用jQuery的过滤器(以完全非正统和未记录的方式)来测试可见性。令人困惑的线路完全等同于$(this).is(':visible')
,除此之外更为迅速。
因为一旦找到可见元素就会跳出循环,它可能比选择器串方法快。
对于优化版本+1,虽然在那一点上,我们不妨考虑是什么让它不可见,并直接测试*(假设孩子们都是因为同样的原因而不可见的)*。 – 2012-02-19 22:26:12
......哎呀,为什么我们甚至需要'.index()'?这些都是兄弟姐妹,所以你可以使用'.each()'中的'i'。 – 2012-02-19 22:27:15
@amnotiam这是一个很好的观点,谢谢 - 我同意最好的事情是测试根本原因。然而,如果元素被例如隐藏'隐藏',这是最好的技术... – lonesomeday 2012-02-19 22:38:35
啊,是的,有一个班轮;谢谢。 – frenchie 2012-02-19 22:06:19
直到您将':visible:first'放入主DOM选择中,我才与您同在。 – 2012-02-19 22:07:16
@amnotiam哎呀,我同意,':first'可以省略,因为它返回集合中第一个元素的索引。 – 2012-02-19 22:10:08