2010-01-29 64 views
6

在将dom插入dom之前,有兴趣构建html chunks off-dom,我使用dynatrace做了一些测试。我用bobince的方法: Is there any way to find an element in a documentFragment?基于上下文的getElementById比原生getElementById慢1000倍。像嘶嘶声这样的选择器引擎是否使用更聪明的策略?

我发现它慢了1000倍(在IE7中),这让我感到很吃惊。

由于该功能是非常基本的,我想知道引擎使用的策略,如嘶嘶声。

我想知道是否有一些更有效的方法来做基于上下文的节点选择?

+0

你不应该觉得奇怪。紧随代码之后,他明确建议不要使用它,“跟着参考,跟踪引用几乎肯定会更好,而不是像上面那样依赖于一个天真,表现不佳的函数。” – 2010-01-29 22:33:15

+0

令人惊讶的是,顺序或数量:1000.我预计在2到100之间。 – Olivvv 2010-01-29 22:40:47

回答

1

框架选择器引擎通常是右手先评估的,因此我期望上下文ID选择器为document.getElementById的ID,然后通过加大parentNode来检查结果是否在上下文节点中。这是相当快的,但它不适用于像这个例子那样的文档外DOM树。然后,选择器引擎将不得不以极其缓慢的方式执行它,或者不在意(例如,Sizzle不能与DocumentFragment一起使用)。

有一个更好的方法,让我从那以后,为实现Selectors-API(IE8,Firefox 3.5,Opera 10,Safari 3.1,Chrome 3)的浏览器记得一个片段。您可以使用querySelector应用与DocumentFragment作为上下文节点的CSS选择器,因为API需要DocumentFragment工具NodeSelector

alert(frag.querySelector('#myId')) 

这是不太一样快getElementById,但它的负载比DOM版本更好。

不幸的是,大多数具有选择器API优化的框架在这​​种情况下不会使用它们,或者任何其他使用上下文节点的框架都不会使用它们,因为上下文节点的工作方式与框架传统上实现它的方式不同,使他们不相容。

Selectors-API Level 2提出了类似于传统框架选择器的'scoped'方法......在可用之前还需要一段时间,但在此之前我们可能不会在现有框架中看到优化的上下文选择器。我认为这是一种遗憾,因为虽然使用上下文节点进行过滤但未进行范围界定的方法并不完善,但它仍然非常适用于所有常见情况。

+1

你确定关于'Element.getElementById'吗?根据id选择上下文的整个前提是错误的。一个id在'Document'上下文中是唯一的,而不是在'Element'或'DocumentFragment'中。 – 2010-01-29 22:42:12

+0

哦,是的。我似乎在撒谎,并想到getElementsByTagName。哎呀!更新中...我找到了更多的东西来玩:-) – bobince 2010-01-29 22:46:22

+0

啊。我很震惊,我可能错过了像Element.getElementById()这样的东西。我读了一些关于querySelector的东西,但我必须关注IE7。 @Chetan的重点是执行不在DOM中的HTML选择。 – Olivvv 2010-01-29 22:52:30

0

如果你不介意你插入到DocumentFragment的DOM暂时...

function getElementFromFragById(frag, id) { 
    var tempDiv = document.createElement("div"); 
    tempDiv.style.display = "none"; 
    tempDiv.appendChild(frag); 
    document.body.appendChild(tempDiv); 
    var elem = document.getElementById(id); 
    document.body.removeChild(tempDiv); 
    return document.getElementById(id) ? null : elem; //if the element still exists, we have a problem 
} 

这可以可靠地工作,只要你documentFragment不包含的ID已经存在document元素和要搜索该ID。

+0

我想从本质上操纵html,以避免重排,这是一个很大的性能成本。不幸的是,当隐藏的元素受到影响时,IE7会回流。请参阅http://www.phpied.com/the-new-game-show-will-it-reflow/在旁注中,我不确定片段在通过函数时仍然是片段,因此可能会取消使用片段的性能提高。无论如何,我在这里有兴趣在外运行,所以不一定是碎片。 – Olivvv 2010-01-30 04:11:46

相关问题