2011-06-23 16 views
50

Tengo un selector xpath. ¿Cómo puedo obtener los elementos que coincidan con ese selector usando jQuery?elemento de selección de jquery por xpath

He visto https://developer.mozilla.org/en/Introduction_to_using_XPath_in_JavaScript pero no usa jQuery, y parece un poco demasiado detallado, y supongo que no es un navegador cruzado.

Además, este http://jsfiddle.net/CJRmk/ no parece funcionar.

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>

Respuesta

17

document.evaluate() (DOM Nivel 3 XPath) es compatible con Firefox, Chrome, Safari y Opera - el único navegador que falta es MSIE. Sin embargo, jQuery admite expresiones XPath básicas: http://docs.jquery.com/DOM/Traversing/Selectors#XPath_Selectors (trasladado a un complemento en la versión actual de jQuery, consulte https://plugins.jquery.com/xpath/). Sin embargo, simplemente convierte expresiones XPath en selectores CSS equivalentes.

+0

Es una versión antigua de API de jQuery para los selectores – Karolis

+0

@Karolis: Tienes razón, parece que esta funcionalidad se ha movido en un complemento. Edité mi respuesta para agregar esta información. –

+1

jQuery XPath plugin está ahora en https://plugins.jquery.com/xpath/ – egor83

18

Primero cree una función de selector 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; 
} 

Para utilizar el selector XPath con jQuery, puede hacerlo de esta manera:

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

Esperamos que esto pueda ayudar.

+0

Creo que esto no funcionará si el documento usa espacio de nombres y en IE10-11 (XPath no es compatible). –

+0

Gracias, he usado su función _x() en el código Behat/Mink para corregir resultados insuficientes ('xpath', 'xpath expression') en algunas situaciones. – myselfhimself

113

Si está depurando o similar - En las herramientas para desarrolladores de Chrome, sólo tiene que utilizar

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

Esto también funciona para Safari. Mucho será una cosa de WebKit. ¡Gracias! – GregT

+7

@GregT ... y Firefox –

+0

@AloisMahdal, parece que es una cosa Firebug (no 100% seguro de que no es parte de Firefox). [Documentación en el sitio de Firebug] (https://getfirebug.com/wiki/index.php/$x). También es solo una abreviatura de 'document.evaluate()', que @WladimirPalant mencionó. – Kat

Cuestiones relacionadas