以下两种方法都可以完成相同的任务。他们搜索与选择器匹配的后代,这些后代没有嵌套在另一个匹配中。我试图确定这两种方法中哪一种更有效,但我不确定计算它们之间性能差异的最佳方法是什么。有任何想法吗?
我目前倾向于我想出的那个(第一个),因为它不需要触摸与选择器不匹配的节点。但是,如果嵌套太深,第二个嵌套可能会减少接触。如果性能差异是纯粹的情境,是否有一个很好的检查来确定使用哪个逻辑集?
function closestDescendants(selector, context)
{
/// <summary>
/// Similar but opposite to closest (ancestor),
/// Returns the descendants matching the selector,
/// but not their descendants.
/// </summary>
/// <param name="selector">The jQuery selector for the descendants.</param>
/// <param name="context">The parent to search under.</param>
if(!context)
{
context = document;
}
var $context = $(context);
// Using find/filter/closest
return $context
.find(selector)
.filter(function()
{
var $this = $(this);
var $closest = $this.parent().closest(selector, $context);
return !$closest.length || $context.is($closest);
});
}
在编写第一种方法后,我遇到了http://bugs.jquery.com/ticket/8263,它使用了下面的逻辑。
function closestDescendants(selector, context)
{
/// <summary>
/// Similar but opposite to closest (ancestor),
/// Returns the descendants matching the selector,
/// but not their descendants.
/// </summary>
/// <param name="selector">The jQuery selector for the descendants.</param>
/// <param name="context">The parent to search under.</param>
if(!context)
{
context = document;
}
var $context = $(context);
var selection = [];
var query = function($node)
{
$node.children().each(function()
{
var $this = $(this);
if($this.is(selector))
{
selection.push(this);
}
else
{
query.call($this);
}
});
};
query.call($context);
return this.pushStack(selection, "closestDown", selector);
}
答案 0 :(得分:1)
嗯,它几乎总是取决于场景,所以在找到最有效的后代方面没有不同的赢家。
但在你的情况下,我建议用console.time包装你的函数调用,并亲自看看哪一个更快完成。
console.time('My Benchmark');
closestDescendants(parameters);
console.timeEnd('My Benchmark');
这将在控制台内打印以毫秒为单位的时间。只需确保您使用的是Chrome或Firefox,并且不要在生产环境中使用console.time(它在IE中不起作用并且可能会出错)。