2011-06-23 33 views
50

Tôi có bộ chọn xpath. Làm thế nào tôi có thể nhận được các yếu tố phù hợp với bộ chọn bằng cách sử dụng jQuery?yếu tố chọn jquery bởi xpath

Tôi đã xem https://developer.mozilla.org/en/Introduction_to_using_XPath_in_JavaScript nhưng không sử dụng jQuery và có vẻ như quá dài và tôi cho rằng đó không phải là trình duyệt chéo.

Ngoài ra, điều này http://jsfiddle.net/CJRmk/ dường như không hoạt động.

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>

Trả lời

17

document.evaluate() (DOM Level 3 XPath) được hỗ trợ trong trình duyệt Firefox, Chrome, Safari và Opera - chỉ trình duyệt lớn thiếu là MSIE. Tuy nhiên, jQuery hỗ trợ các biểu thức XPath cơ bản: http://docs.jquery.com/DOM/Traversing/Selectors#XPath_Selectors (được chuyển vào một plugin trong phiên bản jQuery hiện tại, xem https://plugins.jquery.com/xpath/). Nó chỉ đơn giản là chuyển đổi các biểu thức XPath thành các bộ chọn CSS tương đương.

+0

Đây là một phiên bản cũ của jQuery API cho selectors – Karolis

+0

@Karolis: Bạn nói đúng, trông giống như chức năng này đã được di chuyển vào một plugin. Tôi đã chỉnh sửa câu trả lời của mình để thêm thông tin này. –

+1

Plugin jQuery XPath hiện có tại https://plugins.jquery.com/xpath/ – egor83

18

Trước tiên hãy tạo hàm chọn 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; 
} 

Để sử dụng bộ chọn xpath với jquery, bạn có thể làm như thế này:

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

Hy vọng điều này có thể giúp đỡ.

+0

Tôi nghĩ rằng điều này sẽ không hoạt động nếu tài liệu sử dụng không gian tên và trong IE10-11 (XPath không được hỗ trợ). –

+0

Cảm ơn, tôi đã sử dụng hàm _x() của bạn trong mã Behat/Mink để sửa kết quả tìm kiếm ('xpath', 'xpath expression') không đủ trong một số trường hợp. – myselfhimself

113

Nếu bạn đang gỡ lỗi hoặc tương tự - Trong công cụ phát triển chrome, bạn chỉ có thể sử dụng

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

Điều này cũng phù hợp với Safari. Phần lớn là một điều WebKit. Cảm ơn! – GregT

+7

@GregT ... và Firefox –

+0

@AloisMahdal, có vẻ như đó là một điều Firebug (không chắc chắn 100% rằng nó không phải là một phần của Firefox). [Tài liệu trên trang web của Firebug] (https://getfirebug.com/wiki/index.php/$x). Nó cũng chỉ là viết tắt của 'document.evaluate()', mà @WladimirPalant đã đề cập. – Kat

Các vấn đề liên quan