例如,第一段代码会执行两次完整搜索吗?如果没有发生DOM更改,是否足够聪明地缓存结果? 通用标签

通用标签

如果选择器更复杂,我可以想象这是一个不小的成功。

有帮助吗?

解决方案

jQuery没有,但是有可能在表达式中分配给变量,然后在后续表达式中重复使用这些变量。因此,对示例进行缓存处理... 通用标签

不利之处在于,这会使代码更加笨拙且难以理解。

其他提示

始终缓存您的选择!

使用同一选择器不断地反复调用$( selector )是浪费时间。

或者几乎总是...您通常应该将jQuery对象的缓存副本保留在局部变量中,除非您期望它已更改或只需要一次。 通用标签

与其说是“要做吗?”,不如说是“可以吗?”,不,不是-您自上次查询以来可能已向DOM添加了其他匹配元素。这样会使缓存的结果过时,并且jQuery除了再次运行查询之外,没有其他(明智的)判断方法。

例如: 通用标签

在此示例中,如果对查询进行任何缓存,则不会隐藏新添加的元素-它只会隐藏之前显示的元素。

我只是做了一个解决这个问题的方法: 通用标签

它的工作原理如下: 通用标签

据我所知,根据此简单检查,结果是准确的: 通用标签

注意,它将破坏您的MooTools实现或任何其他使用$$表示法的库。

我不认为这样做(尽管我现在不希望阅读三千五百行JavaScript来确定答案)。

但是,您所做的不需要多个选择器-这应该可以工作: 通用标签

类似于您的$$方法,我创建了一个(具有相同名称的)函数,该函数使用记忆模式来保持全局清洁,并且还考虑了第二个上下文参数……例如$$(“。class”,“#context”)。如果您使用返回$之后发生的链接函数find(),则需要使用此函数。因此除非您先缓存上下文对象,否则不会单独缓存它。我还在末尾添加了布尔参数(第二或第三参数,具体取决于您是否使用上下文),以强制其返回到DOM。

代码: 通用标签

用法: 通用标签

我不相信jquery不会对选择器进行任何缓存,而是依靠下面的xpath / javascript来处理。话虽如此,选择器中可以使用许多优化。这是一些涵盖一些基本知识的文章:

此$$()效果很好-在任何情况下都应返回一个有效的jQuery对象,永远不会被定义。

请小心!它应该/不能与动态变化的选择器一起使用,例如。通过添加与选择器匹配的节点或使用伪类。 通用标签

当然,$$可以是任何函数名称。

John Resig在jQuery Camp 2008的Jquery Internals演讲中确实提到了一些浏览器支持在修改DOM时触发的事件。在这种情况下,Selctor结果可以被缓存。

有一个很好的插件,叫做 jQache 可以做到这一点。 安装插件后,我通常会这样做:

var $$= $ .q;

然后

$$(“#navbar .heading”)。hide();

所有这些最好的部分是,如果您要进行动态处理,还可以在需要时刷新缓存,例如:

$$(“#navbar .heading”,true).hide();//刷新缓存并隐藏新的(新发现的)#navbar .heading

还有

$$。clear();//完全清除缓存

jsPerf今天关闭,但本文建议,通过缓存jQuery选择器而获得的性能提升将很小。

“在此处输入图片描述”

这可能仅取决于浏览器缓存。测试的选择器只是一个ID。对于更复杂的选择器和不同的页面结构,应该做更多的测试...

jQuery Sizzle 会自动缓存最近的功能,已经从选择器创建了一个以查找DOM元素。但是元素本身不会被缓存。

此外,Sizzle维护着最新编译功能的缓存。缓存具有最大大小(可以调整,但具有默认大小),因此在使用许多不同的选择器时不会出现内存不足错误。

$。selectorCache()很有用:

https://gist.github.com/jduhls/ceb7c5fdf2ae1fd2d613e1bab160e296

要点嵌入:

通用标签

检查是否有帮助 https://plugins.jquery.com/cache/

将此作为我们常规项目的一部分

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top