2011-06-23 165 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