选择器:仅获得特定级别后代的最快方法

时间:2013-09-19 10:33:26

标签: javascript jquery jquery-selectors nested-table

我有一张表:

<table id="table">
    <tbody>
        <tr></tr>
        <tr>
            <td>
                <table>
                    <tbody>
                        <tr></tr>
                    </tbod>
                </table>
            </td>
        </tr>
     </tbody>
</table>

我正在使用jQuery,并且存在一个存储的选择器来获取最外层的表:

var x = $('#table')

从那开始如果想要获得所有第一级 <tr> - 元素。

如果我使用其中一个:

x.find('tbody > tr');
x.children('tbody').children();

...第一个也会自然地选择所有嵌套的<tr> - 元素。后者似乎过于复杂,涉及多个查询。

有没有办法让这更快/更有效?

3 个答案:

答案 0 :(得分:2)

首先,x.find('tbody > tr')会找到所有<tr>。您需要执行x.find('> tbody > tr'),假设您的示例中xx

我和两个人都进行了测试,这是我的发现。

.children(): 3.013ms
>: 0.626ms

因此>方法比.children()方法快。函数调用加起来......几乎没有。

这是我用于测试的JavaScript。

var $table = $('#table'), $usingChildren, $usingAngleBracket;

console.time('.children()');
$usingChildren = $table.children('tbody').children('tr');
console.timeEnd('.children()');

console.time('>');
$usingAngleBracket = $table.find('> tbody > tr');
console.timeEnd('>');

console.log( $usingChildren, $usingAngleBracket );

答案 1 :(得分:1)

获得direct children parent的最快方式是.children,所以您可以做的是:

$('tbody').children('tr')

.find()也会搜索child of child,因此您可能不想使用它。

答案 2 :(得分:0)

使用可以使用jQuery的.first()方法查找第一个<tr>元素,

$('#mytable tr').first()

虽然您希望找到包含 嵌套 子元素的第一个<tr>,但您可以使用.has()对其进行过滤。例如:http://jsfiddle.net/cwL4q/3/

$("#mytable tr").has('tbody').first().css("background-color", "red" ); 

虽然,我强烈建议只使用一个类标记'嵌套'<tr>,然后您可以更快地访问它们,如您所知。

$('.nestedrow');

对于以下HTML:

<table id="table">
        <tbody>
            <tr></tr>
            <tr class="nestedrow">
                <td>
                    <table>
                        <tbody>
                            <tr></tr>
                        </tbod>
                    </table>
                </td>
            </tr>
         </tbody>
    </table>