从右到左jQuery选择器无法正常工作

Jas*_*vis 0 javascript jquery jquery-selectors

在阅读有关jQuery Selector性能的StackOverflow帖子时,我一遍又一遍地阅读同样的事情,说jQuery使用Bottom upRight to Left方法来选择器.

以这个例子为例......

$("#dnsTitle a.save").removeClass("disabled");
Run Code Online (Sandbox Code Playgroud)

根据我一直在阅读的内容,使用它代替更好的性能......

$("a.save #dnsTitle").removeClass("disabled");
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是这根本不起作用!有人可以澄清做选择器的真正最佳方法吗?

我正在研究一个现有的项目,它有一些非常长的选择器,我正在努力改进它们,但我似乎得到了不好的信息或过时的信息.我正在使用jQuery 2.0

Jos*_*eph 8

"Bottom Up/Right to Left/Leaf to Root"的概念仅与选择器解析器的实现有关,而与使用中的选择器的顺序无关.

用法:

从使用角度来看,选择器从左到右"读取",第一个选择器是根,后续选择器是后代.返回与最后一个选择器匹配的元素.所以:

#dnsTitle a.save- 查找id为dnsTitlefrom 的元素,从中查找a带有class 的decendant 元素save.你最终a得到了类的元素save.

a.save #dnsTitle- 查找a具有类的元素,save并从中查找id为的decendant dnsTitle.你最终得到了id的任何元素dnsTitle

解析:

现在从解析的角度来看,解析选择器字符串有两种常用的方法,它们是"自上而下"和"自下而上":

  • 自上而下/根到叶/从左到右

    如果您已经完成了数据结构课程,那么这就是您通常解析树的方法.您可以找到要启动的节点,这将是您的第一个选择器.然后,您将找到后续节点.

    这种方法的一个问题是它使用递归方法并使用大量内存,特别是如果您的树很大.此外,回溯问题是一个问题,因为后续的选择器是后代,并且匹配的深度可能不同.下一个选择器可能匹配一个伟大的^ N孙子.递归走N步,找到那个伟大的^ N孩子,并采取N步骤返回.

  • 自下而上/从右到左/从根到出

    使用此方法,解析器将查找与最后一个选择器匹配的所有元素,并最终得到一个匹配数组.使用该匹配数组,如果它们与后续的先前选择器匹配,则对它们进行过滤.

    这种方法的优点是您可以使用固定数组,而不是可变深度树.此外,您正在进行线性过滤,因为在这种情况下,节点只能有一个父对象,而自上而下处理多个子节点.这也意味着你只需要循环来完成工作,而不是递归.一个循环可以遍历每个结果,另一个循环可以遍历每个祖先,如果它与后续的先前选择器匹配.