2011-06-23 36 views
50

我有一个xpath选择器。我如何使用jQuery获取与选择器匹配的元素?jQuery的选择元素xpath

我见过https://developer.mozilla.org/en/Introduction_to_using_XPath_in_JavaScript,但它不使用jQuery,它看起来有点过于冗长,我想它不是跨浏览器。

另外,这个http://jsfiddle.net/CJRmk/似乎不工作。

alert($("//a").length);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script> 
 
<a href="a1.php"></a> 
 
<a href="a2.php"></a>

回答

17

document.evaluate()(DOM级别3的XPath)在火狐,Chrome,Safari和Opera支持 - 唯一的主要浏览器中缺少的是MSIE。不过,jQuery支持基本的XPath表达式:http://docs.jquery.com/DOM/Traversing/Selectors#XPath_Selectors(在当前jQuery版本中移入插件,请参阅https://plugins.jquery.com/xpath/)。它只是将XPath表达式转换为等效的CSS选择器。

+0

它是选择 – Karolis

+0

旧版本的jQuery API的@Karolis:你说得对,是这样的功能已经移到插入一个插件。我编辑了我的答案以添加此信息。 –

+1

jQuery XPath插件现在位于https://plugins.jquery.com/xpath/ – egor83

18

首先创建一个xpath选择器函数。

function _x(STR_XPATH) { 
    var xresult = document.evaluate(STR_XPATH, document, null, XPathResult.ANY_TYPE, null); 
    var xnodes = []; 
    var xres; 
    while (xres = xresult.iterateNext()) { 
     xnodes.push(xres); 
    } 

    return xnodes; 
} 

要使用与jQuery的XPath的选择,你可以这样做:

$(_x('/html/.//div[@id="text"]')).attr('id', 'modified-text'); 

希望这可以帮助。

+0

我认为这不会工作,如果文档使用命名空间,并在IE10-11(XPath不支持)。 –

+0

谢谢,我在Behat/Mink代码中使用了_x()函数来修复find('xpath','xpath expression')在某些情况下效率不高的结果。 – myselfhimself

113

如果你正在调试或类似 - 在Chrome开发者工具,你可以简单地使用

$x('/html/.//div[@id="text"]') 
+1

这也适用于Safari。很多是WebKit的东西。谢谢! – GregT

+7

@GregT ...和Firefox –

+0

@AloisMahdal,它看起来像是一个Firebug的东西(不是100%确定它不属于Firefox的一部分)。 [Firebug网站的文档](https://getfirebug.com/wiki/index.php/$x)。它也是'document.evaluate()'的缩写,@WladimirPalant提到。 – Kat