jQuery是否对“选择器”进行某种形式的缓存?
-
08-07-2019 - |
题
例如,第一段代码会执行两次完整搜索吗?如果没有发生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();//完全清除缓存
jQuery Sizzle 会自动缓存最近的功能,已经从选择器创建了一个以查找DOM元素。但是元素本身不会被缓存。
此外,Sizzle维护着最新编译功能的缓存。缓存具有最大大小(可以调整,但具有默认大小),因此在使用许多不同的选择器时不会出现内存不足错误。
检查是否有帮助 https://plugins.jquery.com/cache/
将此作为我们常规项目的一部分