我对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?
答案 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();
我希望大多数jQuery方法都经过编码,以便在测试集合的长度之前没有发生任何剧烈的事情,但你永远不会知道。
答案 2 :(得分:0)
在jQuery中过滤将返回一个带有DOM匹配元素列表的jQuery对象,后续过滤器将在这些DOM元素上调用,依此类推。
如果没有匹配项,jQuery中的过滤将返回一个带有空DOM列表的jQuery对象,并为空列表调用后续过滤器,因此它也不会返回匹配项。
这就像缩小过滤范围一样。