Javascript XPath还是querySelector?

Javascript XPath还是querySelector?,javascript,xpath,css-selectors,greasemonkey,selectors-api,Javascript,Xpath,Css Selectors,Greasemonkey,Selectors Api,XPath可以完成querySelector所能做的一切,甚至更多,那么您什么时候会选择后者呢?我还没有看到任何速度基准对两者进行比较,所以现在我选择基于语法简洁性,这似乎有点武断 编辑:我可能应该声明我正在为Firefox编写Greasemonkey脚本,所以我不担心跨浏览器兼容性,也不希望包含任何库。您使用的浏览器是什么?在Safari(或iPhone)中,querySelector和querySelectorAll比XPath快得多。IE根本不支持XPath,IE6和IE7也不支持quer

XPath可以完成querySelector所能做的一切,甚至更多,那么您什么时候会选择后者呢?我还没有看到任何速度基准对两者进行比较,所以现在我选择基于语法简洁性,这似乎有点武断


编辑:我可能应该声明我正在为Firefox编写Greasemonkey脚本,所以我不担心跨浏览器兼容性,也不希望包含任何库。

您使用的浏览器是什么?在Safari(或iPhone)中,querySelector和querySelectorAll比XPath快得多。IE根本不支持XPath,IE6和IE7也不支持querySelector。最快的跨浏览器选择器引擎是由John Resig创建的。Sizzle也是jQuery中使用的主要选择器引擎。它在适当的地方使用querySelector,在querySelector不可用的地方使用普通DOM方法。

就功能而言,最好的选择是使用包含选择器引擎的库,其中许多库(例如MooTools、Dojo、Prototype)已经在内部使用XPath来执行某些查询类。你应该能够指望一个好的图书馆为你选择快速的方法

XPath可能能够做querySelector所能做的一切(我认为这句话有点可疑,但这是离题的),但是querySelector和querySelectorAll并不是所有浏览器都支持的,所以我们确实应该将XPath与本机DOM查询方法进行比较(即getElementsByTagName、getElementById、querySelector、标准遍历和筛选方法等)


使用本机DOM过滤方法需要了解浏览器的怪癖和限制,并且很快就不适用于复杂的查询,除非您使用库(例如jQuery或MooTools)来消除不一致。本机DOM技术(无论是通过类似jQuery的代理还是自定义实现)的原因与XPath相比,它们提供了比XPath更大的灵活性。例如,如果要筛选选中的输入,“隐藏”元素或禁用的输入XPath很短,但jQuery提供了:checked、:hidden和:disabled伪类。

只有在您还没有学习XPath但只知道CSS选择器的情况下,才可以使用querySelector。除此之外,XPath语法甚至对于简单的查询也可能更复杂。因此,如果您不需要XPath提供的功能,就可以使用它使用CSS选择器可能更容易

你应该注意两件事:

  • id选择器在纯XML上使用时不能与querySelector一起使用(或者至少不可靠)
  • querySelector仅适用于浏览器当前支持的选择器,因此如果它不支持某些CSS3选择器,则不能使用这些选择器

    • CSS语法非常棒,原因有二:

      • 与更复杂的XPath相比,它的速度快了一个数量级,资源密集度也更低
      • 如果使用css选择器可以找到您想要查找的内容,那么执行相同操作的相应XPath查询在大多数情况下都会变得更长、更难读取
      举个例子:使用这个css选择器:
      h1.header>a[rel~=“author”]

      它最短的函数XPath等价物是
      //h1[contains(“+normalize space(+@class)+”,“header”)]/a[contains(“+normalize space(+@rel)+”,“author”)]

      …这两者都很难读写

      如果改为编写此XPath:
      //h1[@class=“header”]/a[@rel=“author”]

      …您可能会错误地错过标记,如

      但是,当您确实需要XPath时,它是唯一的选项,除非您想手动使用代码(速度非常快)遍历DOM

      就我个人而言(我是Greasemonkey的维护者之一),我使用这个非常小的库来满足我所有的节点切片需求——这让我结合了XPath(在我需要的时候)和CSS(我几乎总是倾向于使用CSS)–主要是因为它让我能够将处理挖掘我需要消化的页面部分的所有代码分离到脚本头中,这样我的代码就可以得到它需要的所有东西,并且可以真正为网页做有趣或伟大的事情


      Web浏览器经过了大量优化,可以非常快速地运行javascript,如果我是你,我建议你使用让你作为开发人员最高效、最快乐的东西,而不是让浏览器运行最少的代码。不过,特别是
      on.js
      的一个附带好处是,它可以自动帮助脚本ften根本无法运行,在您认为存在节点的页面上,结果不是运行,而是破坏页面。

      这不是两件完全不同的事情吗?我以为querySelector用于CSS选择器,XPath用于XML节点/属性。CSS和XPath选择器都在DOM上运行,因为XML和HTML文档都是定义的就文档对象模型而言,由于
      querySelector*
      document.evaluate
      ,现在您可以在任何一个上使用这两种模型,虽然.XPath比Chrome 35.0.1916.153m、Opera 24.0.1555.0(都带有闪烁引擎)中的querySelectorAll快得多,但HTML文档仍然不支持原生XPath,但在运行此测试时,querySelectorAll比Firefox 30.0中的XPath快得多:。因此,这实际上取决于所使用的浏览器-这可能是一个相关的观点,例如,在不使用任何外部库的情况下开发浏览器扩展时…但只有当这些毫秒真正起作用时,我认为这是一种相对罕见的情况。