J'ai, par exemple, la prochaine requête XPath:
//div[span="something"]/parent::div/child::div[@class=\"someClass\"]
Je souhaite utiliser cette requête XPath en JavaScript:
return $("a:contains('Fruits')").mouseover();
J'ai essayé ceci:
return $("div[span=\"something\"]/parent::div/child::div[@class=\"someClass\"]").mouseover();
Mais ça n'a pas marché. Existe-t-il une autre sémantique pour les requêtes XPath afin de les utiliser en JavaScript?
Vous pouvez réécrire vos requêtes xpath en tant que sélecteurs CSS:
$('div:has(> div > span:contains(something)) > div.someClass');
Vous pouvez obtenir le même effet que parent::
en utilisant le sélecteur :has
pseduo pour sélectionner un élément en fonction de ses enfants: div.foo:has(> div.bar)
sélectionnera tous les éléments div
de classe foo
ayant un enfant div
de classe bar
. Ceci est équivalent à div[@class="bar"]/parent::div[@class="foo"]
.
Voir:
Vous pourriez probablement aborder cela de plusieurs autres manières en utilisant diverses combinaisons méthodes de traversée de DOM de jQuery . Par exemple, ce serait une traduction très directe de votre requête xpath:
$('div:has(> span:contains(something))') // //div[span="something"]
.parent('div') // /parent::div
.children('div.someClass'); // /child::div[@class="someClass"]
Il est intéressant de noter que div.someClass
en CSS n'est pas l'équivalent exact de div[@class="someClass"]
dans xpath. Le CSS correspondra à <div class='foo someClass bar'>
, mais pas le xpath. Voir L'article de Brian Suda sur l'analyse de microformats avec XSLT pour plus de détails.
Vous pouvez ajouter les résultats d'une évaluation XPath existante à une sélection jQuery. J'ai assemblé cette extension jquery qui semble faire tout pour vous.
Exemple d'utilisation:
$(document).xpathEvaluate('//body/div').remove()
Voici le complément.
$.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;
}
En tant que co-auteur de Wicked Good XPath , je le recommande certainement pour le support XPath entre navigateurs (sur les documents HTML, vous pouvez essayer de l’utiliser avec des documents XML mais le support est incomplet).
Nous nous félicitons de tout type de test d’exactitude/test de performance de notre bibliothèque. Au cours du développement, la bibliothèque a été testée sur IE 7 à 10, plus le navigateur Android 2.2 ne prenant pas en charge XPath en natif.
Pour autant que je sache, il n'y a pas d'implémentation multi-navigateurs. Il y a un plugin xpath pour jQuery qui dit est encore en développement.
En dehors de cela, il existe une implémentation JavaScript pur de la spécification DOM Level 3 XPath créée par Google et appelée wicked-good-xpath qui est bonne.
Je ne suis pas sûr de la clause parent::div
, mais sans elle, elle devrait ressembler à ceci:
$('div[span="something"] div.someClass');
si vous souhaitez sélectionner un élément dans une iframe, depuis la fenêtre parente, vous devez remplacer le deuxième paramètre de la fonction evaulate () par l'élément de document iframe, comme suit:
var iFrameDocument = $('iframe#myPage').get(0).contentWindow.document;
xpathResult = this[0].evaluate(xpathExpression, iFrameDocument, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
lisez à partir d'ici la méthode evaluate
: https://developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript
var xpathResult = document.evaluate( xpathExpression, contextNode, namespaceResolver, resultType, result );
jQuery a seulement un support limité pour XPath. Vous pouvez voir ce qu’il supporte ici: http://docs.jquery.com/DOM/Traversing/Selectors#XPath_Selectors
Comme mentionné par @Ameoo, vous pouvez utiliser la méthode d'évaluation, disponible dans la plupart des navigateurs modernes - à l'exception, bien entendu, de IE: jquery select element by xpath