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
元素,其中包含子div
class级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