如果找到0匹配,jQuery会继续过滤吗?

时间:2011-08-22 10:12:26

标签: jquery

我对jQuery过滤的效率有疑问。我刚写了很长的表达式,我想知道如果当前的匹配数为0,jQuery是否会停止过滤。

passengers.filter('input.FromDate[value="01/09/2011"]')
          .closest('tr')
          .filter('input.ToDate[value="08/09/2011"]')
          .length;

如果在第一个filter()调用后匹配数为0,jQuery会继续搜索DOM还是放弃其他调用并返回0?

3 个答案:

答案 0 :(得分:3)

对不存在的内容进行过滤将返回一个空的包装集。将调用后续过滤器,但不会产生任何影响。

$('div').filter('.isnt-here').end().filter('.spacer').length;

在问题页面上运行此操作会返回25

答案 1 :(得分:1)

使用jQuery进行可链接调用的好处是,当没有匹配时,不会发生任何不好的事情。

当你调用.filter并且已经产生了零匹配时, 按照定义执行后续链式方法调用,因为它们是直接在返回的对象上调用的(这就是链接的内容) 。

如果没有匹配项,JavaScript仍会在每个返回的对象上调用每个后续链接的方法。浪费的处理发生了多少取决于具体方法的实现方式。

$.fn.doesItTryToDoStuff = function() {
    alert('called');

    // here I could have some wasteful process
    // which could foolishly be executed
    // even when there are no elements


    return this.each(function() {
       $(this).css("border", "1px solid red"); 
    });
};

$("input").filter("[value='foo']").doesItTryToDoStuff().doesItTryToDoStuff();

Demo.

我希望大多数jQuery方法都经过编码,以便在测试集合的长度之前没有发生任何剧烈的事情,但你永远不会知道。

答案 2 :(得分:0)

在jQuery中过滤将返回一个带有DOM匹配元素列表的jQuery对象,后续过滤器将在这些DOM元素上调用,依此类推。

如果没有匹配项,jQuery中的过滤将返回一个带有空DOM列表的jQuery对象,并为空列表调用后续过滤器,因此它也不会返回匹配项。

这就像缩小过滤范围一样。