[英]Right to Left jQuery Selectors not working
在阅读有关Stackoverflow的有关jQuery Selector性能的文章时,我不断地重复阅读相同的内容,说jQuery对选择器使用了自下而上或从右到左的方法。
举个例子...
$("#dnsTitle a.save").removeClass("disabled");
根据我一直在阅读的内容,使用它代替会更好。
$("a.save #dnsTitle").removeClass("disabled");
我遇到的问题是,这根本不起作用! 有人可以澄清做选择器的真正最佳方法吗?
我正在一个现有的项目中进行选择,它的选择器很长,我正在尽力改进它们,但似乎我得到的信息不正确或过时。 我正在使用jQuery 2.0
“自下而上/从右到左/从叶到根”的概念仅与选择器解析器的实现有关,与选择器的使用顺序无关。
从使用的角度来看,选择器是从左到右“读取”的,第一个选择器是您的根,随后的选择器是后代。 返回与最后一个选择器匹配的元素。 所以:
#dnsTitle a.save
查找一个具有dnsTitle
id的元素,然后从其dnsTitle
查找一个类为save
a
元素。 您最终a
带有save
类的a
元素。
a.save #dnsTitle
查找具有类save
a
元素,然后从中找到id为dnsTitle
。 您最终得到的是具有id dnsTitle
任何元素
现在,从解析的角度来看,解析选择器字符串有两种常用方法,它们是“自上而下”和“自下而上”:
自上而下/从根到叶子/从左到右
如果您读过“数据结构”课程,那么通常这就是解析树的方式。 您找到要开始的节点,它将是您的第一个选择器。 然后,您将继续寻找下一个节点。
这种方法的问题是它使用递归方法并使用大量内存,尤其是在您的树很大的情况下。 另外,由于后续的选择器是后代 ,因此回溯问题也是一个问题,并且匹配的深度可能会有所不同。 下一个选择器可能匹配一个great ^ N孙子。 递归深入了N步,找到了那个大^ N个孩子,并采取了N步来返回。
自下而上/从右到左/从根到叶
使用这种方法,解析器将查找与最后一个选择器匹配的所有元素,最后得到一个匹配数组。 使用该匹配项数组,如果它们与后续的先前选择器匹配,则对它们进行过滤。
这种方法的优点是您需要处理固定的数组,而不需要可变深度的树。 另外,由于节点在这种情况下只能有一个父节点,而自顶向下处理多个子节点时,则只能进行线性过滤。 这也意味着您只需要循环即可完成工作,而无需递归。 一个循环可以遍历每个结果,而另一个则嵌套,如果它与后续的先前选择器匹配,则可以遍历每个祖先。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.