Javascript:在jQuery中使用xpath

例如,我有下一个XPath查询:

//div[span="something"]/parent::div/child::div[@class=\"someClass\"] 

我想在JavaScript中使用此XPath查询:

 return $("a:contains('Fruits')").mouseover(); 

我试过这个:

 return $("div[span=\"something\"]/parent::div/child::div[@class=\"someClass\"]").mouseover(); 

但它没有用。 XPath查询是否有另一种语义才能在JavaScript中使用它们?

您可以将您的xpath查询重写为CSS选择器:

 $('div:has(> div > span:contains(something)) > div.someClass'); 

您可以使用以下方法实现与parent::相同的效果parent::使用pseduo选择器根据其子元素选择元素: div.foo:has(> div.bar)div.foo:has(> div.bar)将选择具有类div所有div元素,其中包含子divclass级bar 。 这相当于div[@class="bar"]/parent::div[@class="foo"]

看到:

  • jQuery API:选择器
  • 嘶嘶声的文件

您可以使用各种组合jQuery的DOM遍历方法以其他几种方式处理此问题。 例如,这将是您的xpath查询的非常直接的转换:

 $('div:has(> span:contains(something))') // //div[span="something"] .parent('div') // /parent::div .children('div.someClass'); // /child::div[@class="someClass"] 

值得注意的是,CSS中的div.someClass并不完全等同于xpath中的div[@class="someClass"] 。 CSS将匹配

,但xpath不会。 有关更多详细信息,请参阅Brian Suda关于使用XSLT解析微格式的文章 。

您可以将现有XPath评估的结果添加到jQuery选择中,我将这个jquery扩展集合在一起,这似乎是为您完成的。

用法示例:

 $(document).xpathEvaluate('//body/div').remove() 

这是加载项。

 $.fn.xpathEvaluate = function (xpathExpression) { // NOTE: vars not declared local for debug purposes $this = this.first(); // Don't make me deal with multiples before coffee // Evaluate xpath and retrieve matching nodes xpathResult = this[0].evaluate(xpathExpression, this[0], null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); result = []; while (elem = xpathResult.iterateNext()) { result.push(elem); } $result = jQuery([]).pushStack( result ); return $result; } 

作为Wicked Good XPath的合着者,我当然推荐它用于跨浏览器XPath支持(在HTML文档上,您可以尝试将其与XML文档一起使用,但支持不完整)。

我们欢迎任何类型的正确性测试/性能基准测试我们的库。 在开发过程中,该库已经在IE 7到10以及没有本机XPath支持的Android 2.2浏览器上进行了测试。

据我所知,目前还没有跨浏览器实现。 有一个jQuery的xpath插件 ,它仍然处于开发阶段。

除此之外,有一个谷歌创作的DOM Level 3 XPath规范的纯JavaScript实现称为wicked-good-xpath ,这很好。

我不确定parent::div子句,但没有它,它应该是这样的:

 $('div[span="something"] div.someClass'); 

如果要从父窗口中选择iframe内的元素,则应将evaulate()函数的第二个参数更改为iframe的文档元素,如:

 var iFrameDocument = $('iframe#myPage').get(0).contentWindow.document; xpathResult = this[0].evaluate(xpathExpression, iFrameDocument, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null); 

从这里阅读有关evaluate方法的内容: https : //developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript

 var xpathResult = document.evaluate( xpathExpression, contextNode, namespaceResolver, resultType, result ); 

jQuery只对XPath提供有限的支持。 您可以在此处查看它支持的内容: http : //docs.jquery.com/DOM/Traversing/Selectors#XPath_Selectors

正如@Ameoo所提到的,你可以使用在大多数现代浏览器中都可用的evaluate方法 – 除了可预测的IE: jquery select by xpath